如果我通过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的第一个位置(未命名)参数隐式绑定到:
-
-Command
inpowershell.exe
(Windows PowerShell) -
-File
inpwsh
(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命令行的最后。