我花了一些时间找出 Powershell 脚本的正确语法。然而最终这是一种反复试验的方法,我想知道为什么下面的语法不起作用。
该脚本以提升模式启动新的 Powershel 并设置环境变量。这是摘录:
$x = "NewValue"
$arguments = "-NoExit", "-command", "&{ [Environment]::SetEnvironmentVariable(`"MyVar1`", `"$x`", [EnvironmentVariableTarget]::Machine) }"
Start-Process powershell -Verb runAs -ArgumentList $arguments
Run Code Online (Sandbox Code Playgroud)
如果我只是打印出变量$arguments,它就是我所期望的一个数组:
-NoExit
-command
&{ [Environment]::SetEnvironmentVariable("MyVar1", "NewValue", [EnvironmentVariableTarget]::Machine) }
Run Code Online (Sandbox Code Playgroud)
然而,在子 Powershell 中,双引号以某种方式被吃掉并丢失了。为什么?这是预期的行为吗?它输出:
At line:1 char:42
+ &{ [Environment]::SetEnvironmentVariable(MyVar1, NewValue, [EnvironmentVariableT ...
+ ~
Missing ')' in method call.
At line:1 char:42
+ &{ [Environment]::SetEnvironmentVariable(MyVar1, NewValue, [EnvironmentVariableT ...
+ ~~~~~~
Unexpected token 'MyVar1' in expression or statement.
At line:1 char:48
+ &{ [Environment]::SetEnvironmentVariable(MyVar1, NewValue, [EnvironmentVariableT ...
+ ~
Missing argument in parameter list.
At line:1 char:2
+ &{ [Environment]::SetEnvironmentVariable(MyVar1, NewValue, [EnvironmentVariableT ...
+ ~
Missing closing '}' in statement block.
At line:1 char:96
+ ... arget]::Machine) }
+ ~
Unexpected token ')' in expression or statement.
At line:1 char:98
+ ... get]::Machine) }
+ ~
Unexpected token '}' in expression or statement.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : MissingEndParenthesisInMethodCall
Run Code Online (Sandbox Code Playgroud)
我的环境:
> $PSVersionTable
Name Value
---- -----
PSVersion 4.0
WSManStackVersion 3.0
SerializationVersion 1.1.0.1
CLRVersion 4.0.30319.42000
BuildVersion 6.3.9600.17400
PSCompatibleVersions {1.0, 2.0, 3.0, 4.0}
PSRemotingProtocolVersion 2.2
Run Code Online (Sandbox Code Playgroud)
=================================================== =============
作为参考,这里的工作版本使用单引号而不是双引号(我还删除了 -NoExit 参数,该参数仅用于调试):
$x = "NewValue"
$arguments = "-command", "&{ [Environment]::SetEnvironmentVariable('MyVar1', `'$x`', [EnvironmentVariableTarget]::Machine) }"
Start-Process powershell -Verb runAs -ArgumentList $arguments
Run Code Online (Sandbox Code Playgroud)
这就是如何PowerShell.exe解析其命令行。它主要遵循.NET 命令行解析规则:
空格是参数分隔符。PowerShell.exe无论您使用多少个空格来分隔参数,都将通过单个空格连接各个参数。
CMD> PowerShell -Command echo 'multiple spaces'
multiple spaces
Run Code Online (Sandbox Code Playgroud)如果要在参数值中包含空格,则应将空格括在双引号中。双引号本身不是结果参数值的一部分,可以位于参数内的任何位置:
CMD> PowerShell -Command echo 'mult"iple spa"ces'
multiple spaces
Run Code Online (Sandbox Code Playgroud)如果您希望文字双引号成为参数值的一部分,则必须使用反斜杠对其进行转义:
CMD> PowerShell -Command echo 'literal\"double\"quotes'
literal"double"quotes
Run Code Online (Sandbox Code Playgroud)如果您希望文字反斜杠位于双引号之前,则必须使用另一个反斜杠转义该反斜杠。除此之外,反斜杠按字面解释,不需要转义:
CMD> PowerShell -Command echo 'back\\slash\\" something\\else\\"'
back\\slash\ something\\else\
Run Code Online (Sandbox Code Playgroud)| 归档时间: |
|
| 查看次数: |
1850 次 |
| 最近记录: |