为何PowerShell参数需使用两对引号?技术疑问
先拆解这段代码实际生成的内容:假设你的strCmdText是"./test.ps1 -Option Demo",那最终传给Process的参数会是"&'./test.ps1 -Option Demo'"。下面说清楚这两对引号为啥都不能少:
外层双引号:给Process用的
Process启动外部程序(这里是powershell.exe)时,会按空格拆分参数。外层双引号的作用就是把整个PowerShell命令打包成一个完整参数,避免命令里的空格(比如脚本路径、参数值里的空格)被Process拆成好几个零散参数传给PowerShell。
举个反例:要是没外层双引号,Process会把&、'./test.ps1、-Option、Demo当成四个独立参数扔给PowerShell,PowerShell根本认不出这是要执行一个完整脚本。
内层单引号:给PowerShell用的
PowerShell里用&是执行脚本/命令的专用符号,当你的脚本路径带空格(比如"C:\我的脚本\test.ps1")或者命令里有特殊字符时,必须用引号把整个脚本加参数的内容包起来。
这里用单引号而不是双引号,是因为单引号在PowerShell里是“字面量引号”——里面的内容会原封不动执行,不会解析变量(比如$开头的内容),而且不会和外层的双引号冲突,避免参数解析混乱。
结论:两对引号都得留
缺了外层双引号,Process会拆错参数;缺了内层单引号,PowerShell会识别不了带空格的脚本路径或者特殊字符。只有两对都用上,才能保证在各种场景下(不管脚本路径有没有空格、命令带不带特殊字符),PowerShell都能正确执行你的脚本命令。
内容的提问来源于stack exchange,提问作者t3chb0t

