1
+ Function Get-SQLAgentJobDuration
2
+ {
3
+ <#
4
+ . Synopsis
5
+ Returns the Job Duration for an agent job on an instance or number of instances with the Job Names provided dynamically
6
+ . DESCRIPTION
7
+ This function returns the Job Duration for an agent job on an instance or number of instances with the Job Names provided dynamically
8
+ It can also output to CSV and prompt if youwould like to open the file
9
+ . EXAMPLE
10
+ Get-SQLAgentJobDuration -Instances SERVER -JobName 'Job must run quickly'
11
+
12
+ This will return the servername. jobname, rundate and duration of the 'Job must run quickly' job on the Instance SERVER
13
+ . EXAMPLE
14
+ Get-SQLAgentJobDuration -Instances SERVER -JobName 'Job must run quickly' -CSV
15
+
16
+ This will output the servername. jobname, rundate and duration of the 'Job must run quickly' job on the Instance SERVER into a CSV file
17
+ located in the Users MyDocuments folder named JobName_Date_Time.csv
18
+ . EXAMPLE
19
+ Get-SQLAgentJobDuration -Instances SERVER -JobName 'Job must run quickly' -CSV -Path c:\temp
20
+
21
+ This will output the servername. jobname, rundate and duration of the 'Job must run quickly' job on the Instance SERVER into a CSV file
22
+ located in C:\Temp named JobName_Date_Time.csv
23
+ . NOTES
24
+ AUTHOR - Rob Sewell https://sqldbawithabeard.com
25
+ DATE - 30/10/2016
26
+ #>
27
+ # Requires -Version 5
28
+ # Requires -Module sqlserver
29
+ param
30
+ (# The Server/instance
31
+ [Parameter (Mandatory = $true , HelpMessage = ' The Instance' ,
32
+ ValueFromPipeline = $true ,
33
+ ValueFromPipelineByPropertyName = $true ,
34
+ ValueFromRemainingArguments = $false ,
35
+ Position = 0 )]
36
+ [ValidateNotNull ()]
37
+ [ValidateNotNullOrEmpty ()]
38
+ [object ]$Instances ,
39
+ # CSV required
40
+ [Parameter (Mandatory = $false , HelpMessage = ' Want to output to CSV' )]
41
+ [switch ]$CSV ,
42
+ # Path for CSV
43
+ [Parameter (Mandatory = $false , HelpMessage = ' Path for CSV' )]
44
+ [object ]$Path
45
+ )
46
+ DynamicParam {
47
+ # Set the dynamic parameters' name
48
+ $ParameterName = ' JobName'
49
+
50
+ # Create the dictionary
51
+ $RuntimeParameterDictionary = New-Object - TypeName System.Management.Automation.RuntimeDefinedParameterDictionary
52
+
53
+ # Create the collection of attributes
54
+ $AttributeCollection = New-Object - TypeName System.Collections.ObjectModel.Collection[System.Attribute ]
55
+
56
+ # Create and set the parameters' attributes
57
+ $ParameterAttribute = New-Object - TypeName System.Management.Automation.ParameterAttribute
58
+ $ParameterAttribute.Mandatory = $true
59
+ $ParameterAttribute.Position = 1
60
+
61
+ # Add the attributes to the attributes collection
62
+ $AttributeCollection.Add ($ParameterAttribute )
63
+
64
+ # Generate and set the ValidateSet
65
+ $arrSet = (Get-SQLAgentJob - ServerInstance $Instances ).Name
66
+ $ValidateSetAttribute = New-Object - TypeName System.Management.Automation.ValidateSetAttribute - ArgumentList ($arrSet )
67
+
68
+ # Add the ValidateSet to the attributes collection
69
+ $AttributeCollection.Add ($ValidateSetAttribute )
70
+
71
+ # Create and return the dynamic parameter
72
+ $RuntimeParameter = New-Object - TypeName System.Management.Automation.RuntimeDefinedParameter - ArgumentList ($ParameterName , [string ], $AttributeCollection )
73
+ $RuntimeParameterDictionary.Add ($ParameterName , $RuntimeParameter )
74
+ return $RuntimeParameterDictionary
75
+ }
76
+
77
+ begin {
78
+ # Bind the parameter to a friendly variable
79
+ $JobName = $PsBoundParameters [$ParameterName ]
80
+ $FormattedDuration = @ {Name = ' FormattedDuration' ;Expression = {[timespan ]$_.RunDuration.ToString ().PadLeft(6 , ' 0' ).insert(4 , ' :' ).insert(2 , ' :' )}}
81
+ }
82
+ Process {
83
+ $JObs = (Get-SQLAgentJobHistory - ServerInstance $Instances ).Where {$_.JoBName -eq $JobName }
84
+ $Result = $Jobs.Where {$_.Stepid -eq 0 } | Select Server, JobName, RunDate, $FormattedDuration
85
+ }
86
+ End {
87
+ if ($CSV )
88
+ {
89
+ if (! $Path )
90
+ {
91
+ $docs = [Environment ]::GetFolderPath(" mydocuments" )
92
+ $Path = $Docs
93
+ }
94
+
95
+ $Date = Get-Date - Format yyyyMMdd_HHmmss
96
+ $FilePath = $Path + ' \' + $jobname + ' _' + $Date + ' .csv'
97
+ $Result | Export-Csv - Path $FilePath - NoTypeInformation
98
+
99
+ # Prompt to create and then create.
100
+ $title = " Want to Open the file??"
101
+ $message = " Would you like to open the CSV file now? (Y/N)"
102
+ $yes = New-Object System.Management.Automation.Host.ChoiceDescription " &Yes" , " Will continue"
103
+ $no = New-Object System.Management.Automation.Host.ChoiceDescription " &No" , " Will exit"
104
+ $options = [System.Management.Automation.Host.ChoiceDescription []]($yes , $no )
105
+ $result = $host.ui.PromptForChoice ($title , $message , $options , 0 )
106
+
107
+ if ($result -eq 1 )
108
+ {
109
+ return " OK File is located at $FilePath "
110
+ }
111
+ else
112
+ {
113
+ Invoke-Item - Path $FilePath
114
+ }
115
+ }
116
+ else
117
+ {
118
+ $Result
119
+ }
120
+ }
121
+ }
0 commit comments