2016-06-24 14 views
3

PowerShell変数を、別の場所で呼び出したいコマンドの一部(Gitコマンド)に割り当てようとしています。その代わり、スクリプトは(Visual Studioの2015内部NuGetパッケージのインストールの一部として)実行時にPowerShellの引用符が正しくエスケープされない理由

"C:\Program Files\Git\bin\git.exe" -C "C:\MySolution" 

:私はこのような値を生成するために期待してい

$gitExe = "`"$env:programfiles\Git\bin\git.exe`" -C `"$solutionFolder`"" 

:私はこのラインを持っています

Invoke-Expression : At line:1 char:3 
+ ""C:\Program Files (x86)"\Git\bin\git.exe -C "C:\MySolution ... 
+ ~~~~~~~~~~ 
Unexpected token 'C:\Program' in expression or statement. 

私はPowerShellのに新たなんだ、と私は他の回答からの提案を試みたが、私はそれが(すべての異なる種類の障害に)動作させることができなかった:私はこのエラーを取得します。

+0

あなたは '' 'をエスケープするのを避けるために、' "'を '' '' '' ''と '' ' – sodawillow

+0

@sodawillow私は反対を試みたが、それは働いたように見えた。 Thanks – Dov

答えて

3

AFAICSエスケープには何も問題はありませんが、あなたはどのように誤解しているのですかInvoke-Expression。コマンドレットは、指定された文字列をコマンドラインとして実行する方法を提供します。ただし、call operator&)を使用しない限り、PowerShellはコマンドラインのコマンドとしてベア文字列(ケース"C:\Program Files\Git\bin\git.exe")を受け付けません。その代わりに、予期しないトークンに文字列をエコーし​​ようとしたが、失敗します。

デモンストレーション:

PS C:\>"$env:windir\system32\ping.exe" 
C:\Windows\system32\ping.exe 
PS C:\>"$env:windir\system32\ping.exe" -n 1 127.0.0.1 
At line:1 char:33 
+ "$env:windir\System32\PING.EXE" -n 1 127.0.0.1 
+         ~~ 
Unexpected token '-n' in expression or statement. 
At line:1 char:36 
+ "$env:windir\System32\PING.EXE" -n 1 127.0.0.1 
+         ~ 
Unexpected token '1' in expression or statement. 
At line:1 char:38 
+ "$env:windir\System32\PING.EXE" -n 1 127.0.0.1 
+          ~~~~~~~~~ 
Unexpected token '127.0.0.1' in expression or statement. 
    + CategoryInfo   : ParserError: (:) [], ParentContainsErrorRecordException 
    + FullyQualifiedErrorId : UnexpectedToken 

PS C:\>& "$env:windir\system32\ping.exe" -n 1 127.0.0.1 

Pinging 127.0.0.1 with 32 bytes of data: 
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128 

Ping statistics for 127.0.0.1: 
    Packets: Sent = 1, Received = 1, Lost = 0 (0% loss), 
Approximate round trip times in milli-seconds: 
    Minimum = 0ms, Maximum = 0ms, Average = 0ms
PS C:\>$cmd = "'$env:windir\system32\ping.exe' -n 1 127.0.0.1" 
PS C:\>$cmd 
'C:\Windows\system32\ping.exe' -n 1 127.0.0.1 
PS C:\>Invoke-Expression $cmd 
Invoke-Expression : At line:1 char:32 
+ 'C:\Windows\system32\ping.exe' -n 1 127.0.0.1 
+        ~~ 
Unexpected token '-n' in expression or statement. 
At line:1 char:35 
+ 'C:\Windows\system32\ping.exe' -n 1 127.0.0.1 
+         ~ 
Unexpected token '1' in expression or statement. 
At line:1 char:37 
+ 'C:\Windows\system32\ping.exe' -n 1 127.0.0.1 
+          ~~~~~~~~~ 
Unexpected token '127.0.0.1' in expression or statement. 
At line:1 char:1 
+ Invoke-Expression $cmd 
+ ~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : ParserError: (:) [Invoke-Expression], ParseException 
    + FullyQualifiedErrorId : UnexpectedToken,Microsoft.PowerShell.Commands.InvokeExpressionCommand 

PS C:\>$cmd = "& '$env:windir\system32\ping.exe' -n 1 127.0.0.1" 
PS C:\>$cmd 
& 'C:\Windows\system32\ping.exe' -n 1 127.0.0.1 
PS C:\>Invoke-Expression $cmd 

Pinging 127.0.0.1 with 32 bytes of data: 
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128 

Ping statistics for 127.0.0.1: 
    Packets: Sent = 1, Received = 1, Lost = 0 (0% loss), 
Approximate round trip times in milli-seconds: 
    Minimum = 0ms, Maximum = 0ms, Average = 0ms

をあなただけにもすぐに呼び出し演算子を使用して(Invoke-Expressionを完全に捨てることができることを意味しますすでに提案されている@MartinBrandl)。

$gitExe = "$env:ProgramFiles\Git\bin\git.exe" 
& $gitExe -c $solutionFolder 
+0

いつものように、素敵な答え。 –

3

まず、私はパスを結合して、&を使用してgitを呼び出し、パラメータを渡すためにJoin-Pathコマンドレットを使用します。二重引用符の内側

$gitExe = Join-Path $env:programfiles '\Git\bin\git.exe' 
& $gitExe -c $solutionFolder 
+0

'$ gitExe'変数の後には他のものがあります。たとえば、 '$ gitExe add -f $ theFile' – Dov

+1

の場合、すべてのパラメータをハッシュテーブルに保存し、スプラットを使用して' $ gitExe'に渡すべきでしょう。 –

1

使用単一引用符:

$gitExe = "'$env:programfiles\Git\bin\git.exe' -C '$solutionFolder'" 

他の方法では、変数は展開されませんでした。

+1

これは 'Invoke-Expression'と組み合わせて動作しません。 –

関連する問題