2011-07-16 10 views
2

PowerShell内でVisual Studioの環境変数を設定するためにいくつかの関数を使用していて、vcvarsXXX.batバッチファイルを実行して、 setの出力とname = valueを探し、Set-Itemを使ってPS側の環境変数を設定します。

のようにこれが見えない機能:私が呼び出す場合、私は気づいた問題があることは、正規表現マッチの後で

# from Bruce Payette's book to set the environment variables, slightly modified 
function Get-Batchfile ($file) { 
    $cmd = "`"$file`" & set" 
    cmd /c $cmd | Foreach-Object { 
     # variation from Payette's book, use a regex in case the batch file writes some output, only take name=value 
     if ($_ -match "^(.*?)=(.*)$") { 
      # make sure they look good 
      write-host $matches[1] "=" $matches[2] 
      $name=$matches[1] 
      $value=$matches[2] 
      write-host ">>> $name = $value" 
      Set-Item -path env:$name -value $value 
      # for some reason the set item below does not seem to work even though the values of $matches look good 
      #Set-Item -path env:$matches[1] -value $matches[2] 
     } 
    } 
} 

セットアイテムのENV -path:$マッチ[1] $マッチ[2]

- 値が、私は$の名前と$値に$試合を割り当て、呼び出す場合:

セットアイテムのENV -path:$名前 - 値の$値

期待どおりに動作します。

私はこれを回避しましたが、最初のものがなぜ機能していないのか理解したいと思います。むしろコードをよりコンパクトに保ち、2つの一時変数を作成する必要はありません。

答えて

3

文字列でこれらのハッシュテーブル参照を使用したのと同じ状況だと思います。オブジェクトのプロパティであれば、$($ variable.property)の部分式を使用する必要があります。 $ variable.propertyを変数に代入すると、その変数を部分式を使用せずに使用できます。ハッシュテーブルエントリと配列スライスでも同じように動作します。

Set-Item -path env:$($matches[1]) -value $($matches[2]) 
+0

少なくとも通常の括弧は十分です値のために:これは良く機能しない場合

を参照してください。 – Joey

+0

追加評価なしで値は機能します。変数はそうではありません。 – mjolinor

+0

だから私は "可変"ではなく "価値"と言ったのです。 – Joey

関連する問題