PowerShell.exe直接传入脚本路径未加-参数仍生效的语法疑问
解答
对应参数说明
你用的powershell "C:\Users\MyUser\Downloads\Myscript.ps1"写法完全不匹配-PSConsoleFile参数,实际是隐式绑定到了-Command参数,等价于显式写法:
powershell -Command "C:\Users\MyUser\Downloads\Myscript.ps1"
执行逻辑就是启动PowerShell进程后,把传入的路径字符串当作PowerShell命令执行,最终运行目标脚本。
这里要注意和显式指定-File参数的差异:
- 显式加
-File时,PowerShell会直接把后续值识别为脚本路径,后面跟的参数会直接作为脚本的入参传递,不会做额外的命令语法解析,是官方推荐的脚本运行写法 - 隐式走
-Command时,传入的整段字符串会被当作PowerShell命令行做语法解析,如果你后面追加脚本参数,很容易因为PowerShell的解析规则出现参数识别错误。
未指定参数名仍可运行的原因
PowerShell.exe的参数集区分命名参数和位置参数:
-PSConsoleFile、-Version、-File、-EncodedCommand这类都属于命名参数,必须显式写出带-前缀的参数名,才会被正确识别绑定,哪怕你第一个参数就传了符合格式的控制台文件路径、版本号,只要没写对应参数名,就不会匹配到这些参数。-Command是PowerShell.exe的默认位置参数,优先级最高:只要命令行里没有显式指定其他需要接收独立值的命名参数(比如-File、-EncodedCommand),第一个不带-前缀的未绑定值,就会自动绑定到-Command参数,不需要你手动写-Command标识。
平时我们在CMD里直接写
powershell Get-Service就能直接执行查询服务的命令,靠的就是这个默认位置参数的规则,省去了每次写-Command的麻烦。
内容的提问来源于stack exchange,提问作者NoErrorNoCry
相关产品推荐
相关产品推荐

