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

2023-12-24

我正在编写一个控制台应用程序来验证 PowerShell 脚本语法。 我的请求是验证 PowerShell 脚本而不执行该脚本。我在下面的 PowerShell 命令中发现了这个命令,它可以在不执行脚本的情况下执行语法检查。

Get-Command -syntax 'D:\powershell\deleteDemoFile.ps1'

但是,我发现它没有进行完整的语法检查。 例如,在 PowerShell 中使用变量而无需声明 或者他们的拼写错误(Function、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 https://stackoverflow.com/a/55337824/3725706


请注意,目的是Get-Command https://learn.microsoft.com/powershell/module/microsoft.powershell.core/get-command's -Syntaxswitch 是显示命令的语法图 https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_Command_Syntax,即显示其参数及其类型,即如何调用它.

Since discovering this information for scripts requires parsing them, as a side effect you would indeed detect syntax errors[1] (the Get-Command call then fails and reports the specific syntax error encountered).

然而,你的示例脚本确实not包含syntax errors: 虽然它不会做你想做的事执行时, it is 语法上有效的:

  • ifTypo and FunctionTypo被解释为命令名称,不是拼写错误的keywords.

    • 因此,您只会看到问题执行时,当尝试调用command(cmdlet、函数、脚本、别名、可执行文件)命名ifTypo,例如,是制成的。
  • 看概念图about_解析 https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.core/about/about_Parsing帮助主题以获取有关以下内容的信息PowerShell 的两种基本解析模式,argument模式(如 shell)和表达模式(如编程语言).


The Invoke-ScriptAnalyzer https://learn.microsoft.com/en-us/powershell/module/psscriptanalyzer/invoke-scriptanalyzercmdlet(的一部分PSScriptAnalyzer您可以安装的模块Install-Module PSScriptAnalyzer) 建议来自iRon https://stackoverflow.com/users/1701026/iron,它也用在 Visual Studio Code 的 PowerShell 扩展中进行设计时分析,may能够指出潜在的其他问题,但在手头的情况下它不会(它只是警告Write-Host在您的脚本中使用)。


Note:

  • PowerShell 的两种解析模式总是相当漂亮宽容的语法,一般来说,你能做的只有这么多static用动态语言进行分析。

  • 现有功能无法检测脚本的问题;一个可能的解决方案是询问新规则用于标记潜在的关键字拼写错误被添加到Invoke-ScriptAnalyzer, by 在项目的 GitHub 存储库中打开一个问题 https://github.com/PowerShell/PSScriptAnalyzer/issues/new/choose,但请注意,这些规则最终是猜测,因为看起来像拼写错误的关键字可能是合法的命令名称。


[1] In effect, Get-Command -Syntax is indirectly a convenient shortcut to calling the official PowerShell parser in order to find syntax errors, which requires more effort - see this answer https://stackoverflow.com/a/43214144/45375.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 PowerShell cmdlet 对 PowerShell 脚本文件进行完整语法检查 的相关文章

  • 将服务器添加到 SQL Management Studio

    我想将不同服务器上的一堆 SQL 2000 2005 的混合 服务器实例添加到我的 SSMS SQL Managment Studio 注册服务器 我正在遵循本教程here http sev17 com 2008 12 registerin
  • 验证以防止角度形式出现重复的形式值

    我有几个表单数组 我需要进行验证 以便每个表单行中的特定字段在所有表单数组中必须是唯一的 如果任何值出现多次 则两个表单字段都必须标记为红色 我设法编写了一个函数 以便如果这些字段有任何更改 该函数将返回 true false 但我不确定如
  • 在约束验证器中使用 Guice 进行依赖注入

    我有一个在 ConstraintValidator 的实现中注入类的用例 我正在使用 Google guice 进行依赖项注入 目前无法在验证器内注入 我的场景的简化形式 内部模块 Provides Singleton public Ser
  • 拖放到 Powershell 脚本

    我以为我已经找到了这个问题的答案 但我玩得越多 我就越发现它是 Powershell 的设计缺陷 我想拖放 或使用发送到机制 将多个文件和 或文件夹作为数组传递到 Powershell 脚本 测试脚本 Test ps1 param stri
  • 无法在 Powershell 中运行 R.exe

    我经常发现在命令行 Windows 上运行 R 更有用 然而 当我在 Powershell 中尝试时 我往往会遇到问题 但这可以通过第一次运行轻松克服cmd然后就可以了 这是我执行此操作时遇到的错误R CMD BATCH Invoke Hi
  • “Microsoft.AspNet.Server.Kestrel”不包含适合入口点的静态“Main”方法

    我正在尝试运行最新的Asp Net 5 个示例 https github com aspnet Home 当前为 1 0 0 rc1 update1 来自 Windows 10 上的 powershell 我将活动和默认 DNX 设置为 C
  • Rails:验证字符串的最小和最大长度,但允许其为空白

    我有一个想要验证的字段 我希望该字段能够留空 但如果用户输入数据 我希望它采用某种格式 目前我在模型中使用以下验证 但这不允许用户将其留空 validates length of foo maximum gt 5 validates len
  • 从 Powershell 更新计划任务脚本

    我正在尝试编写一个每天运行一次的 Powershell 脚本 它将执行的众多功能之一是确保脚本本身是最新的 我的问题是 由于我对脚本进行了版本控制 因此我需要更新从脚本中创建的计划任务 我在这里考虑了两种不同的方法 其中我也无法弄清楚 我最
  • 多步ActiveRecord的模型验证

    考虑具有以下字段的用户模型 名字 必填 姓氏 必填 电子邮件 必填 要求输入密码 电话 必填 大小 10 位数字 地址 必填 以及包含以下步骤的多步骤注册表单 第一步 包含 名字 姓氏 和 电子邮件 字段 第二步输入密码 电话和地址 您将如
  • 如何使breezejs所需的验证器允许空字符串

    在breezejs中允许所需属性中存在空字符串的首选方式是什么 I found 这个答案 https stackoverflow com questions 19658297 how does breeze saves empty stri
  • Start-Job 输出去了哪里?

    W gt job start job Write Output hi there throw an error Wait Job W gt job select State Failed HasMoreData True StatusMes
  • 如何使用PowerShell脚本远程启动/停止IIS 6.0/7.0?

    我有两台服务器服务器 A 和服务器 B 我想使用 Powershell 脚本从服务器 B 远程停止服务器 A 最简单的方法之一就是使用命令行执行PsExec http www microsoft com technet sysinterna
  • 如何将 .bat 文件中的变量获取到 PowerShell 脚本中?

    我正在用 PowerShell 替换 bat 脚本的部分内容 批处理文件的配置是通过以下文件完成的set适当的环境变量 我正在寻找一种方法将这些变量值加载到 ps1脚本 无需修改 bat文件 因为它们也在其他地方使用 一个例子 bat看起来
  • 如何忽略警告错误?

    我有以下 PowerShell 脚本 它获取给定 IP 地址内计算机的 NetBIOS 名称 我正在使用管道将结果转储到文本文件中 问题是 如果 IP 地址不可用 则会打印警告 这是 PowerShell 脚本 function Get C
  • Powershell 数组到带引号的逗号分隔字符串

    我有一个数组 需要输出到逗号分隔的字符串 但我还需要引号 这是我所拥有的 myArray file1 csv file2 csv a myArray join a 输出为 a最终 file1 csv file2 csv 我想要的输出是 fi
  • 获取文件夹及其子文件夹中最长文件路径的长度

    我正在寻找一个可以从命令行 批处理 PowerShell 运行的脚本 该脚本将遍历文件夹及其子文件夹 并返回一个数字 该数字是最长文件路径的长度 我已经看到了一些批处理和 PowerShell 脚本 例如 如何在 Windows 中查找路径
  • PowerShell 脚本 ffmpeg

    作为一名优秀的 Windows 系统管理员 我终于开始学习 PowerShell 话虽这么说 我不知道我在做什么 惊讶 惊讶 我认为远离生产环境 在家里使用 PowerShell 对我来说将是一次很好的学习经历 最近 我开始使用 FFMPE
  • 使用 Powershell SQL 将数据提取到 Excel

    我想使用 powershell 将数据从 SQL Server 提取到新的 excel 文件 对于小型数据集 我的代码可以工作 但某些表的行数超过 100 000 行 这将需要很长时间 我不在 SQl 服务器中使用该实用程序的原因是因为我想
  • 如何在 Powershell 中自动对提示回答“是”?

    如何在 PowerShell 会话中输入 是 作为交互式问题的答案 我知道 在 Bash 中 Yes是在提示上回答 是 的工具 在我的情况下 我无法抑制提示 我正在运行的脚本停止于 如果您想继续 请回复 是 powershell 如何运行脚
  • Sublime Text 编辑器中的 PHP 语法检查

    在Gedit中 我可以在当前文档上添加 php l 外部工具 如果我安装了PHP命令行 它将对文档进行语法检查 有没有办法用 Sublime Text 编辑器来做到这一点 注意 我有一台 Mac 并且安装了 PHP CLI 我想我必须将代码

随机推荐