-
Notifications
You must be signed in to change notification settings - Fork 393
/
Copy pathInvoke-ScriptAnalyzer.md
645 lines (477 loc) · 19.7 KB
/
Invoke-ScriptAnalyzer.md
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
---
external help file: Microsoft.Windows.PowerShell.ScriptAnalyzer.dll-Help.xml
Module Name: PSScriptAnalyzer
ms.custom: PSSA v1.22.0
ms.date: 10/07/2021
online version: https://learn.microsoft.com/powershell/module/psscriptanalyzer/invoke-scriptanalyzer?view=ps-modules&wt.mc_id=ps-gethelp
schema: 2.0.0
---
# Invoke-ScriptAnalyzer
## SYNOPSIS
Evaluates a script or module based on selected best practice rules
## SYNTAX
### Path_SuppressedOnly (Default)
```
Invoke-ScriptAnalyzer [-Path] <string> [-CustomRulePath <string[]>] [-RecurseCustomRulePath]
[-IncludeDefaultRules] [-ExcludeRule <string[]>] [-IncludeRule <string[]>] [-Severity <string[]>]
[-Recurse] [-SuppressedOnly] [-Fix] [-EnableExit] [-Settings <Object>] [-SaveDscDependency]
[-ReportSummary] [-WhatIf] [-Confirm] [<CommonParameters>]
```
### Path_IncludeSuppressed
```
Invoke-ScriptAnalyzer [-Path] <string> -IncludeSuppressed [-CustomRulePath <string[]>]
[-RecurseCustomRulePath] [-IncludeDefaultRules] [-ExcludeRule <string[]>]
[-IncludeRule <string[]>] [-Severity <string[]>] [-Recurse] [-Fix] [-EnableExit]
[-Settings <Object>] [-SaveDscDependency] [-ReportSummary] [-WhatIf] [-Confirm]
[<CommonParameters>]
```
### ScriptDefinition_IncludeSuppressed
```
Invoke-ScriptAnalyzer [-ScriptDefinition] <string> -IncludeSuppressed [-CustomRulePath <string[]>]
[-RecurseCustomRulePath] [-IncludeDefaultRules] [-ExcludeRule <string[]>]
[-IncludeRule <string[]>] [-Severity <string[]>] [-Recurse] [-EnableExit] [-Settings <Object>]
[-SaveDscDependency] [-ReportSummary] [-WhatIf] [-Confirm] [<CommonParameters>]
```
### ScriptDefinition_SuppressedOnly
```
Invoke-ScriptAnalyzer [-ScriptDefinition] <string> [-CustomRulePath <string[]>]
[-RecurseCustomRulePath] [-IncludeDefaultRules] [-ExcludeRule <string[]>]
[-IncludeRule <string[]>] [-Severity <string[]>] [-Recurse] [-SuppressedOnly] [-EnableExit]
[-Settings <Object>] [-SaveDscDependency] [-ReportSummary] [-WhatIf] [-Confirm]
[<CommonParameters>]
```
## DESCRIPTION
`Invoke-ScriptAnalyzer` evaluates scripts or module files (`.ps1`, `.psm1`, and `.psd1` files) based
on a collection of best practice rules and returns objects that represent rule violations. It also
includes special rules to analyze DSC resources.
`Invoke-ScriptAnalyzer` comes with a set of built-in rules. By default, it uses all rules. You can
use the **IncludeRule** and **ExcludeRule** parameters to select the rules you want. You can use the
`Get-ScriptAnalyzerRule` cmdlet to examine and select the rules you want to include or exclude from
the evaluation.
You can also use customized rules that you write in PowerShell scripts, or compile in assemblies
using C#. Custom rules can also be selected using the **IncludeRule** and **ExcludeRule**
parameters.
You can also include a rule in the analysis, but suppress the output of that rule for selected
functions or scripts. This feature should be used only when necessary. To get rules that were
suppressed, run `Invoke-ScriptAnalyzer` with the **SuppressedOnly** parameter.
For usage in CI systems, the **EnableExit** exits the shell with an exit code equal to the number of
error records.
## EXAMPLES
### EXAMPLE 1 - Run all Script Analyzer rules on a script
```powershell
Invoke-ScriptAnalyzer -Path C:\Scripts\Get-LogData.ps1
```
### EXAMPLE 2 - Run all Script Analyzer rules on all files in the Modules directory
This example runs all Script Analyzer rules on all `.ps1` and `.psm1` files in your user-based
`Modules` directory and its subdirectories.
```powershell
Invoke-ScriptAnalyzer -Path $home\Documents\WindowsPowerShell\Modules -Recurse
```
### EXAMPLE 3 - Run a single rule on a module
This example runs only the **PSAvoidUsingPositionalParameters** rule on the files in the
`PSDiagnostics` module folder. You can use a command like this to find all instances of a particular
rule violation.
```powershell
Invoke-ScriptAnalyzer -Path C:\Windows\System32\WindowsPowerShell\v1.0\Modules\PSDiagnostics -IncludeRule PSAvoidUsingPositionalParameters
```
### EXAMPLE 4 - Run all rules except two on your modules
This example runs all rules except for **PSAvoidUsingCmdletAliases** and
**PSAvoidUsingInternalURLs** on the `.ps1` and `.psm1` files in the `MyModules` directory and in its
subdirectories.
```powershell
Invoke-ScriptAnalyzer -Path C:\ps-test\MyModule -Recurse -ExcludeRule PSAvoidUsingCmdletAliases, PSAvoidUsingInternalURLs
```
### EXAMPLE 5 - Run Script Analyzer with custom rules
This example runs Script Analyzer on `Test-Script.ps1` with the standard rules and rules in the
`C:\CommunityAnalyzerRules` path.
```powershell
Invoke-ScriptAnalyzer -Path D:\test_scripts\Test-Script.ps1 -CustomRulePath C:\CommunityAnalyzerRules -IncludeDefaultRules
```
### EXAMPLE 6 - Run only the rules that are Error severity and have the PSDSC source name
```powershell
$DSCError = Get-ScriptAnalyzerRule -Severity Error | Where SourceName -eq PSDSC
$Path = "$home\Documents\WindowsPowerShell\Modules\MyDSCModule"
Invoke-ScriptAnalyzerRule -Path $Path -IncludeRule $DSCError -Recurse
```
### EXAMPLE 7 - Suppressing rule violations
This example shows how to suppress the reporting of rule violations in a function and how to
discover rule violations that are suppressed.
The example uses the `SuppressMessageAttribute` attribute to suppress the **PSUseSingularNouns** and
**PSAvoidUsingCmdletAliases** rules for the `Get-Widgets` function in the `Get-Widgets.ps1` script.
You can use this attribute to suppress a rule for a module, script, class, function, parameter, or
line.
The first command runs Script Analyzer on the script file containing the function. The output
reports a rule violation. Even though more rules are violated, neither suppressed rule is reported.
```powershell
function Get-Widgets
{
[CmdletBinding()]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSUseSingularNouns", "")]
[System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidUsingCmdletAliases", "", Justification="Resolution in progress.")]
Param()
dir $pshome
...
}
Invoke-ScriptAnalyzer -Path .\Get-Widgets.ps1
```
```Output
RuleName Severity FileName Line Message
-------- -------- -------- ---- -------
PSProvideCommentHelp Information ManageProf 14 The cmdlet 'Get-Widget' does not have a help comment.
iles.psm1
```
```powershell
Invoke-ScriptAnalyzer -Path .\Get-Widgets.ps1 -SuppressedOnly
```
```Output
Rule Name Severity File Name Line Justification
--------- -------- --------- ---- -------------
PSAvoidUsingCmdletAliases Warning ManageProf 21 Resolution in progress.
iles.psm1
PSUseSingularNouns Warning ManageProf 14
iles.psm1
```
The second command uses the **SuppressedOnly** parameter to report violations of the rules that are
suppressed script file.
### EXAMPLE 8 - Analyze script files using a profile definition
In this example, we create a Script Analyzer profile and save it in the `ScriptAnalyzerProfile.txt`
file in the current directory. We run `Invoke-ScriptAnalyzer` on the **BitLocker** module files. The
value of the **Profile** parameter is the path to the Script Analyzer profile.
```powershell
# In .\ScriptAnalyzerProfile.txt
@{
Severity = @('Error', 'Warning')
IncludeRules = 'PSAvoid*'
ExcludeRules = '*WriteHost'
}
Invoke-ScriptAnalyzer -Path $pshome\Modules\BitLocker -Profile .\ScriptAnalyzerProfile.txt
```
If you include a conflicting parameter in the `Invoke-ScriptAnalyzer` command, such as
`-Severity Error`, the cmdlet uses the profile value and ignores the parameter.
### EXAMPLE 9 - Analyze a script stored as a string
This example uses the **ScriptDefinition** parameter to analyze a function at the command line. The
function string is enclosed in quotation marks.
```powershell
Invoke-ScriptAnalyzer -ScriptDefinition "function Get-Widgets {Write-Host 'Hello'}"
```
```Output
RuleName Severity FileName Line Message
-------- -------- -------- ---- -------
PSAvoidUsingWriteHost Warning 1 Script
because
there i
suppres
Write-O
PSUseSingularNouns Warning 1 The cmd
noun sh
```
When you use the **ScriptDefinition** parameter, the **FileName** property of the
**DiagnosticRecord** object is `$null`.
## PARAMETERS
### -CustomRulePath
Enter the path to a file that defines rules or a directory that contains files that define rules.
Wildcard characters are supported. When **CustomRulePath** is specified, only the custom rules found
in the specified paths are used for the analysis. If `Invoke-ScriptAnalyzer` cannot find rules in
the , it runs the standard rules without notice.
To add rules defined in subdirectories of the path, use the **RecurseCustomRulePath** parameter. To
include the built-in rules, add the **IncludeDefaultRules** parameter.
```yaml
Type: String[]
Parameter Sets: (All)
Aliases: CustomizedRulePath
Required: False
Position: Named
Default value: None
Accept pipeline input: False
Accept wildcard characters: True
```
### -EnableExit
On completion of the analysis, this parameter exits the PowerShell sessions and returns an exit code
equal to the number of error records. This can be useful in continuous integration (CI) pipeline.
```yaml
Type: SwitchParameter
Parameter Sets: (All)
Aliases:
Required: False
Position: Named
Default value: False
Accept pipeline input: False
Accept wildcard characters: False
```
### -ExcludeRule
Omits the specified rules from the Script Analyzer test. Wildcard characters are supported.
Enter a comma-separated list of rule names, a variable that contains rule names, or a command that
gets rule names. You can also specify a list of excluded rules in a Script Analyzer profile file.
You can exclude standard rules and rules in a custom rule path.
When you exclude a rule, the rule does not run on any of the files in the path. To exclude a rule on
a particular line, parameter, function, script, or class, adjust the Path parameter or suppress the
rule. For information about suppressing a rule, see the examples.
If a rule is specified in both the **ExcludeRule** and **IncludeRule** collections, the rule is
excluded.
```yaml
Type: String[]
Parameter Sets: (All)
Aliases:
Required: False
Position: Named
Default value: All rules are included.
Accept pipeline input: False
Accept wildcard characters: True
```
### -Fix
Fixes certain warnings that contain a fix in their **DiagnosticRecord**.
When you used **Fix**, `Invoke-ScriptAnalyzer` applies the fixes before running the analysis. Make
sure that you have a backup of your files when using this parameter. It tries to preserve the file
encoding but there are still some cases where the encoding can change.
```yaml
Type: SwitchParameter
Parameter Sets: Path_SuppressedOnly, Path_IncludeSuppressed
Aliases:
Required: False
Position: Named
Default value: False
Accept pipeline input: False
Accept wildcard characters: False
```
### -IncludeDefaultRules
Invoke default rules along with Custom rules.
```yaml
Type: SwitchParameter
Parameter Sets: (All)
Aliases:
Required: False
Position: Named
Default value: False
Accept pipeline input: False
Accept wildcard characters: False
```
### -IncludeRule
Runs only the specified rules in the Script Analyzer test. By default, PSScriptAnalyzer runs all
rules.
Enter a comma-separated list of rule names, a variable that contains rule names, or a command that
gets rule names. Wildcard characters are supported. You can also specify rule names in a Script
Analyzer profile file.
When you use the **CustomizedRulePath** parameter, you can use this parameter to include standard
rules and rules in the custom rule paths.
If a rule is specified in both the **ExcludeRule** and **IncludeRule** collections, the rule is
excluded.
The **Severity** parameter takes precedence over **IncludeRule**. For example, if **Severity** is
`Error`, you cannot use **IncludeRule** to include a `Warning` rule.
```yaml
Type: String[]
Parameter Sets: (All)
Aliases:
Required: False
Position: Named
Default value: All rules are included.
Accept pipeline input: False
Accept wildcard characters: True
```
### -IncludeSuppressed
Include suppressed diagnostics in output.
```yaml
Type: SwitchParameter
Parameter Sets: Path_IncludeSuppressed, ScriptDefinition_IncludeSuppressed
Aliases:
Required: True
Position: Named
Default value: False
Accept pipeline input: False
Accept wildcard characters: False
```
### -Path
Specifies the path to the scripts or module to be analyzed. Wildcard characters are supported.
Enter the path to a script (`.ps1`) or module file (`.psm1`) or to a directory that contains scripts
or modules. If the directory contains other types of files, they are ignored.
To analyze files that are not in the root directory of the specified path, use a wildcard character
(`C:\Modules\MyModule\*`) or the **Recurse** parameter.
```yaml
Type: String
Parameter Sets: Path_SuppressedOnly, Path_IncludeSuppressed
Aliases: PSPath
Required: True
Position: 0
Default value: None
Accept pipeline input: True (ByPropertyName, ByValue)
Accept wildcard characters: True
```
### -Recurse
Runs Script Analyzer on the files in the **Path** directory and all subdirectories recursively.
Recurse applies only to the Path parameter value. To search the **CustomRulePath** recursively, use
the **RecurseCustomRulePath** parameter.
```yaml
Type: SwitchParameter
Parameter Sets: (All)
Aliases:
Required: False
Position: Named
Default value: False
Accept pipeline input: False
Accept wildcard characters: False
```
### -RecurseCustomRulePath
Adds rules defined in subdirectories of the **CustomRulePath** location. By default,
`Invoke-ScriptAnalyzer` uses only the custom rules defined in the specified file or directory. To
include the built-in rules, use the **IncludeDefaultRules** parameter.
```yaml
Type: SwitchParameter
Parameter Sets: (All)
Aliases:
Required: False
Position: Named
Default value: False
Accept pipeline input: False
Accept wildcard characters: False
```
### -ReportSummary
Write a summary of the violations found to the host.
```yaml
Type: SwitchParameter
Parameter Sets: (All)
Aliases:
Required: False
Position: Named
Default value: False
Accept pipeline input: False
Accept wildcard characters: False
```
### -SaveDscDependency
Resolve DSC resource dependencies.
When `Invoke-ScriptAnalyzer` is run with this parameter, it looks for instances of
`Import-DSCResource -ModuleName <somemodule>`. If `<somemodule>` is cannot be found by searching the
`$env:PSModulePath`, `Invoke-ScriptAnalyzer` returns parse error. This error is caused by the
PowerShell parser not being able to find the symbol for `<somemodule>`.
If `Invoke-ScriptAnalyzer` finds the module in the PowerShell Gallery, it downloads the missing
module to a temp path. The temp path is then added to `$env:PSModulePath` for duration of the scan.
The temp location can be found in `$LOCALAPPDATA/PSScriptAnalyzer/TempModuleDir`.
```yaml
Type: SwitchParameter
Parameter Sets: (All)
Aliases:
Required: False
Position: Named
Default value: False
Accept pipeline input: False
Accept wildcard characters: False
```
### -ScriptDefinition
Runs the analysis on commands, functions, or expressions in a string. You can use this feature to
analyze statements, expressions, and functions, independent of their script context.
```yaml
Type: String
Parameter Sets: ScriptDefinition_IncludeSuppressed, ScriptDefinition_SuppressedOnly
Aliases:
Required: True
Position: 0
Default value: None
Accept pipeline input: True (ByPropertyName, ByValue)
Accept wildcard characters: False
```
### -Settings
A path to a file containing a user-defined profile or a hashtable object containing settings for
ScriptAnalyzer.
Runs `Invoke-ScriptAnalyzer` with the parameters and values specified in the file or hashtable.
If the path or the content of the file or hashtable is invalid, it is ignored. The parameters and
values in the profile take precedence over the same parameter and values specified at the command
line.
A Script Analyzer profile file is a text file that contains a hashtable with one or more of the
following keys:
- CustomRulePath
- ExcludeRules
- IncludeDefaultRules
- IncludeRules
- RecurseCustomRulePath
- Rules
- Severity
The keys and values in the profile are interpreted as if they were standard parameters and values of
`Invoke-ScriptAnalyzer`, similar to splatting. For more information, see
[about_Splatting](https://learn.microsoft.com/powershell/module/microsoft.powershell.core/about/about_splatting).
```yaml
Type: Object
Parameter Sets: (All)
Aliases: Profile
Required: False
Position: Named
Default value: None
Accept pipeline input: False
Accept wildcard characters: False
```
### -Severity
After running Script Analyzer with all rules, this parameter selects rule violations with the
specified severity.
Valid values are:
- Error
- Warning
- Information.
You can specify one ore more severity values.
The parameter filters the rules violations only after running all rules. To filter rules
efficiently, use `Get-ScriptAnalyzerRule` to select the rules you want to run.
The **Severity** parameter takes precedence over **IncludeRule**. For example, if **Severity** is
`Error`, you cannot use **IncludeRule** to include a `Warning` rule.
```yaml
Type: String[]
Parameter Sets: (All)
Aliases:
Required: False
Position: Named
Default value: All rule violations
Accept pipeline input: False
Accept wildcard characters: False
```
### -SuppressedOnly
Returns violations only for rules that are suppressed.
Returns a **SuppressedRecord** object
(**Microsoft.Windows.PowerShell.ScriptAnalyzer.Generic.SuppressedRecord**).
To suppress a rule, use the **SuppressMessageAttribute**. For help, see the examples.
```yaml
Type: SwitchParameter
Parameter Sets: Path_SuppressedOnly, ScriptDefinition_SuppressedOnly
Aliases:
Required: False
Position: Named
Default value: False
Accept pipeline input: False
Accept wildcard characters: False
```
### -Confirm
Prompts you for confirmation before running the cmdlet.
```yaml
Type: SwitchParameter
Parameter Sets: (All)
Aliases: cf
Required: False
Position: Named
Default value: False
Accept pipeline input: False
Accept wildcard characters: False
```
### -WhatIf
Shows what would happen if the cmdlet runs. The cmdlet is not run.
```yaml
Type: SwitchParameter
Parameter Sets: (All)
Aliases: wi
Required: False
Position: Named
Default value: False
Accept pipeline input: False
Accept wildcard characters: False
```
### CommonParameters
This cmdlet supports the common parameters: -Debug, -ErrorAction, -ErrorVariable,
-InformationAction, -InformationVariable, -OutVariable, -OutBuffer, -PipelineVariable, -Verbose,
-WarningAction, and -WarningVariable. For more information, see
[about_CommonParameters](http://go.microsoft.com/fwlink/?LinkID=113216).
## INPUTS
### None
You cannot pipe input to this cmdlet.
## OUTPUTS
### Microsoft.Windows.PowerShell.ScriptAnalyzer.Generic.DiagnosticRecord
By default, `Invoke-ScriptAnalyzer` returns one **DiagnosticRecord** object for each rule violation.
### Microsoft.Windows.PowerShell.ScriptAnalyzer.Generic.SuppressedRecord
If you use the **SuppressedOnly** parameter, `Invoke-ScriptAnalyzer` instead returns a
**SuppressedRecord** objects.
## NOTES
## RELATED LINKS
[Get-ScriptAnalyzerRule](Get-ScriptAnalyzerRule.md)
[PSScriptAnalyzer on GitHub](https://github.com/PowerShell/PSScriptAnalyzer)