如何使用 PowerShell cmdlet 对 PowerShell 脚本文件进行完整语法检查
How to do full syntax check of PowerShell script file using the PowerShell cmdlet
我正在编写一个控制台应用程序来验证 PowerShell 脚本语法。
我的要求是在不执行脚本的情况下验证 PowerShell 脚本。我在 PowerShell 命令下面找到了这个,它可以在不执行脚本的情况下执行语法检查。
Get-Command -syntax 'D:\powershell\deleteDemoFile.ps1'
但是,我发现它并没有做完整的语法检查。
例如,在没有声明的情况下在 PowerShell 中使用变量
或者他们在(函数、if、ForEach 等)中的拼写错误
上述命令未捕获此类语法错误。
下面是PowerShell脚本文件的示例代码(.\deleteDemoFile.ps1)
请注意在下面的代码中 (if, Function) 的拼写错误并且使用了变量 '$log_dir' 但未声明。
当我 运行 PowerShell 命令时 Get-Command -syntax 'D:\powershell\deleteDemoFile.ps1'
该命令不会抛出任何语法错误。
Write-Host "Hello, World!"
ifTypo(-not (test-path -path $log_dir )) {
new-item -itemtype directory -path $log_dir
}
FunctionTypo log {
Param ([string]$log_string)
write-host $log_string
add-content $log_file -value $log_string
}
log("Deleting a demo txt file")
# PowerShell -WhatIf safety parameter
Clear-Host
Get-Childitem D:\powershell\SomeFile\demo.txt -Recurse | Remove-Item
所以我想知道。
- 此 PowerShell 命令执行语法检查的效率如何?
- 它是否只验证 PowerShell cmdlet、函数和别名的语法?
- 此命令与哪个版本的 PowerShell 脚本兼容?
是否有其他命令可以执行完整的语法检查?
这里是PowerShell命令的参考:
请注意 Get-Command
's -Syntax
switch is to show a command's syntax diagram 的用途,即显示其参数及其类型,即 如何调用它。
由于发现此脚本信息需要解析它们,作为副作用,您确实会检测到语法错误[1](然后 Get-Command
调用失败并报告遇到的特定语法错误)。
但是,您的示例脚本不包含语法错误:虽然它不会'不做你想做的事情 执行时,它语法上有效:
ifTypo
和 FunctionTypo
被解释为 命令名称 ,而不是拼写错误 关键词.
- 因此,当尝试调用 命令(cmdlet、函数、脚本,别名,可执行文件)名为
ifTypo
,例如,已制作。
有关 PowerShell 的两种基本解析模式,argument 模式(如 shell)的信息,请参阅概念性 about_Parsing 帮助主题和 表达式 模式(如编程语言).
Invoke-ScriptAnalyzer
cmdlet (part of the PSScriptAnalyzer
module you can install with Install-Module PSScriptAnalyzer
) suggested by iRon,也用于PowerShell扩展中的Visual Studio设计时分析代码,可能可以指出潜在 其他问题,但在手头的情况下它不会(它只警告不要在您的脚本中使用 Write-Host
)。
注:
PowerShell 的两种解析模式总是相当于一个漂亮的 permissive 语法,一般来说,您可以使用 static 动态语言分析。
现有功能无法检测到您脚本的问题;一个潜在的解决方案是要求 新规则 标记 潜在的 关键字拼写错误被添加到 Invoke-ScriptAnalyzer
,opening an issue in the project's GitHub repo,但请注意,此类规则最终是 猜测,因为看起来拼写错误的关键字可能是合法的命令名称。
[1] 实际上,Get-Command -Syntax
是间接调用官方 PowerShell 解析器以查找语法错误的便捷快捷方式,这需要更多的努力 - 请参阅 .
我正在编写一个控制台应用程序来验证 PowerShell 脚本语法。 我的要求是在不执行脚本的情况下验证 PowerShell 脚本。我在 PowerShell 命令下面找到了这个,它可以在不执行脚本的情况下执行语法检查。
Get-Command -syntax 'D:\powershell\deleteDemoFile.ps1'
但是,我发现它并没有做完整的语法检查。 例如,在没有声明的情况下在 PowerShell 中使用变量 或者他们在(函数、if、ForEach 等)中的拼写错误 上述命令未捕获此类语法错误。
下面是PowerShell脚本文件的示例代码(.\deleteDemoFile.ps1) 请注意在下面的代码中 (if, Function) 的拼写错误并且使用了变量 '$log_dir' 但未声明。
当我 运行 PowerShell 命令时 Get-Command -syntax 'D:\powershell\deleteDemoFile.ps1'
该命令不会抛出任何语法错误。
Write-Host "Hello, World!"
ifTypo(-not (test-path -path $log_dir )) {
new-item -itemtype directory -path $log_dir
}
FunctionTypo log {
Param ([string]$log_string)
write-host $log_string
add-content $log_file -value $log_string
}
log("Deleting a demo txt file")
# PowerShell -WhatIf safety parameter
Clear-Host
Get-Childitem D:\powershell\SomeFile\demo.txt -Recurse | Remove-Item
所以我想知道。
- 此 PowerShell 命令执行语法检查的效率如何?
- 它是否只验证 PowerShell cmdlet、函数和别名的语法?
- 此命令与哪个版本的 PowerShell 脚本兼容?
是否有其他命令可以执行完整的语法检查?
这里是PowerShell命令的参考:
请注意 Get-Command
's -Syntax
switch is to show a command's syntax diagram 的用途,即显示其参数及其类型,即 如何调用它。
由于发现此脚本信息需要解析它们,作为副作用,您确实会检测到语法错误[1](然后 Get-Command
调用失败并报告遇到的特定语法错误)。
但是,您的示例脚本不包含语法错误:虽然它不会'不做你想做的事情 执行时,它语法上有效:
ifTypo
和FunctionTypo
被解释为 命令名称 ,而不是拼写错误 关键词.- 因此,当尝试调用 命令(cmdlet、函数、脚本,别名,可执行文件)名为
ifTypo
,例如,已制作。
- 因此,当尝试调用 命令(cmdlet、函数、脚本,别名,可执行文件)名为
有关 PowerShell 的两种基本解析模式,argument 模式(如 shell)的信息,请参阅概念性 about_Parsing 帮助主题和 表达式 模式(如编程语言).
Invoke-ScriptAnalyzer
cmdlet (part of the PSScriptAnalyzer
module you can install with Install-Module PSScriptAnalyzer
) suggested by iRon,也用于PowerShell扩展中的Visual Studio设计时分析代码,可能可以指出潜在 其他问题,但在手头的情况下它不会(它只警告不要在您的脚本中使用 Write-Host
)。
注:
PowerShell 的两种解析模式总是相当于一个漂亮的 permissive 语法,一般来说,您可以使用 static 动态语言分析。
现有功能无法检测到您脚本的问题;一个潜在的解决方案是要求 新规则 标记 潜在的 关键字拼写错误被添加到
Invoke-ScriptAnalyzer
,opening an issue in the project's GitHub repo,但请注意,此类规则最终是 猜测,因为看起来拼写错误的关键字可能是合法的命令名称。
[1] 实际上,Get-Command -Syntax
是间接调用官方 PowerShell 解析器以查找语法错误的便捷快捷方式,这需要更多的努力 - 请参阅