2015-12-14 95 views
2

我花了一些時間搞清楚Powershell腳本的正確語法。但最終它是試錯法,我想知道爲什麼下面的語法不起作用。Powershell - 轉義字符串傳遞給子進程

該腳本以提升模式啓動新的Powershel並設置環境變量。下面是摘錄:

$x = "NewValue" 
$arguments = "-NoExit", "-command", "&{ [Environment]::SetEnvironmentVariable(`"MyVar1`", `"$x`", [EnvironmentVariableTarget]::Machine) }" 
Start-Process powershell -Verb runAs -ArgumentList $arguments 

如果我剛打印出來的變量$arguments,它是一個數組,因爲我所期望的:

-NoExit 
-command 
&{ [Environment]::SetEnvironmentVariable("MyVar1", "NewValue", [EnvironmentVariableTarget]::Machine) } 

然而,在孩子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 

我的環境:

> $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 

============================== =================================

作爲參考,這裏的工作版本使用單引號而不是雙引號(我還刪除了-NoExit參數,它僅用於調試):

$x = "NewValue" 
$arguments = "-command", "&{ [Environment]::SetEnvironmentVariable('MyVar1', `'$x`', [EnvironmentVariableTarget]::Machine) }" 
Start-Process powershell -Verb runAs -ArgumentList $arguments 
+1

''$參數= 「-noexit」, 「指令」, 「'」 &{[環境] :: SetEnvironmentVariable方法(\''MyVar1 \'「,\'」$ x \'「,[EnvironmentVariableTarget] :: Machine)}'」「'' – PetSerAl

+1

@PetSerAl你爲什麼要回答?作爲評論它是混亂。 – JPBlanc

+1

@JPBlanc恕我直言,它需要的不僅僅是一段代碼,而是一個正確的答案。 – PetSerAl

回答

3

這是如何解析其命令行的PowerShell.exe。它大多遵循.NET rules of command line parsing

  • 空間是一個參數分隔符。 PowerShell.exe將通過單個空間連接各個參數,而不管您用於分隔參數的空間多少。

    CMD> PowerShell -Command echo 'multiple spaces' 
    multiple spaces 
    
  • 如果要在參數值中包含空格,則應該用雙引號括起空格。雙引號本身不產生參數值的部分,可以是內部參數的任何地方:

    CMD> PowerShell -Command echo 'mult"iple spa"ces' 
    multiple spaces 
    
  • 如果你想字面雙引號是參數值的一部分,那麼你必須用反斜槓轉義:

    CMD> PowerShell -Command echo 'literal\"double\"quotes' 
    literal"double"quotes 
    
  • 如果您希望文字反斜槓在雙引號之前,那麼您必須用另一個反斜槓來反轉該反斜線。除此之外,反斜線字面解釋,也不需要進行轉義:

    CMD> PowerShell -Command echo 'back\\slash\\" something\\else\\"' 
    back\\slash\ something\\else\