Powershell.exe:关于语法的一般问题



如果我通过CMD打开powershell,使用以下语法:

powershell "C:UsersMyUserDownloadsMyscript.ps1"

语法是这样的:

PowerShell[.exe]
[-PSConsoleFile <file> | -Version <version>]
[-NoLogo]
[-NoExit]
[-Sta]
[-Mta]
[-NoProfile]
[-NonInteractive]
[-InputFormat {Text | XML}]
[-OutputFormat {Text | XML}]
[-WindowStyle <style>]
[-EncodedCommand <Base64EncodedCommand>]
[-ConfigurationName <string>]
[-File - | <filePath> <args>]
[-ExecutionPolicy <ExecutionPolicy>]
[-Command - | { <script-block> [-args <arg-array>] }
| { <string> [<CommandParameters>] } ]
PowerShell[.exe] -Help | -? | /?

微软文档

我指的是哪个参数
"[-PSConsoleFile <file> | -Version <version>]"吗?
因为在我的例子中,我没有指定参数"-"它还在工作!

不能从链接的帮助主题中引用的语法图中推断出来,但是传递给PowerShell CLI的第一个位置(未命名)参数隐式绑定到:

  • -Commandinpowershell.exe(Windows PowerShell)

  • -Fileinpwsh(PowerShell (Core) 7+)

(不幸的是CLI的语法图不包含这些信息(在cmdlet帮助主题中,它包含这些信息,尽管它可能不太明显—参见这个答案);它也不反映哪些参数互斥,如-File-Command。在撰写本文时,关于位置参数的信息甚至不在about_PowerShell_exe的描述中,但它在about_Pwsh)

中。换句话说:

powershell "C:UsersMyUserDownloadsMyscript.ps1"

等于:

powershell -Command "C:UsersMyUserDownloadsMyscript.ps1"
  • 也就是说,脚本路径在第一个命令中以的位置传递,也就是说,它的目标参数没有像在第二个命令中那样显式指定。另一种方法是将路径作为未命名的参数传递。

  • 位置参数之间的顺序很重要,目标命令必须(a)指定每个可能按位置绑定的参数,(b)指定一个数字来定义所有位置参数之间的相对位置。(在PowerShell代码中,高级函数或脚本(类似cmdlet)将使用参数属性(如[Parameter(Position=0)])来表达,正如Abraham Zinala所指出的那样)-参见概念上的about_Functions_Advanced_Parameters帮助主题)

  • 在PowerShell命令行中,特殊的注意事项适用于位置参数:

    • -Command-File参数之后的任何参数都被视为直通参数:

      • 对于-File,它们被传递到指定的.ps1脚本。
      • 对于-Command,它们构成正在传递的PowerShell源代码的一部分(如果传递多个参数,它们将被单独剥离语法"引号并与空格连接)。
    • 因此,-Command-File-以及任何直通参数-应该始终将放在CLI命令行的最后。

最新更新