gpt4 book ai didi

powershell - 如何使用 PowerShell cmdlet 对 PowerShell 脚本文件进行完整语法检查

转载 作者:行者123 更新时间:2023-12-05 02:40:42 24 4
gpt4 key购买 nike

我正在编写一个控制台应用程序来验证 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 命令的引用:https://stackoverflow.com/a/55337824/3725706

最佳答案

请注意 Get-Command-Syntax 开关的目的是显示命令的 syntax diagram ,即显示其参数及其类型,即如何调用它

由于发现此脚本信息需要解析它们,作为副作用,您确实会检测到语法错误[1] (Get-Command 调用随后失败并报告遇到的特定语法错误)。

但是,您的示例脚本包含语法错误:虽然它在执行时不会执行您想要的操作语法上有效:

  • ifTypoFunctionTypo 被解释为命令名称,而不是拼写错误的关键字 .

    • 因此,您只会在执行时看到问题,当尝试调用名为ifTypo,例如,是制作的。
  • 有关 PowerShell 的两种基本解析模式的信息,请参阅概念性 about_Parsing 帮助主题,参数 模式(如 shell)和表达式 模式(如编程语言)


Invoke-ScriptAnalyzer 建议的 iRon cmdlet(PSScriptAnalyzer 模块的一部分,您可以使用 Install-Module PSScriptAnalyzer 安装),它也用于 Visual Studio 的 PowerShell 扩展用于设计时分析的代码,可能能够指出潜在的其他问题,但在手头的情况下它不会(它只会警告 Write -Host 在你的脚本中使用)。


注意:

  • PowerShell 的两种解析模式总是构成一种相当宽容 的语法,并且一般来说,在动态语言中,静态 分析只能做这么多。

  • 现有功能无法检测您的脚本问题;一个潜在的解决方案是要求 opening an issue in the project's GitHub repo 将用于标记潜在关键字拼写错误的新规则添加到 Invoke-ScriptAnalyzer 中,但请注意此类规则最终是猜测,因为看起来像拼写错误的关键字可能是合法的命令名称。


[1] 实际上,Get-Command -Syntax 是间接调用官方 PowerShell 解析器以查找语法错误的便捷快捷方式,这需要更多的努力 - 请参阅 this answer

关于powershell - 如何使用 PowerShell cmdlet 对 PowerShell 脚本文件进行完整语法检查,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68397836/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com