2012-01-15 4 views
0

私は、PATH環境変数は、私がcmd/c "command"を実行した後のPATH環境変数の決定方法は?

cmd /c "vcvarsall.bat x86_amd64 && echo %PATH%" 

を実行して、バッチファイル(vcvarsall.bat)を実行した後だったが、何が起こるかは、私が期待するものではありませんかを判断します。例えば、私が実行した場合:

cmd /c "set PATH=test && echo %PATH%" 

私はちょうどホストプロセスではなく、「テスト」私は予想通り、エコー%のPATH%と、子プロセスのコンテキストで実行されていないされなければならないのパスを取得します親。だから、なぜこれが起こります、そして、私は後に結果を得るためにどうやって行くのですか?

答えて

3
cmd /c "set PATH=test && echo %PATH%" 

はそれが変わったのPATH前に解釈します。これは実際とsetlocal/endlocalチャンクの外で環境変数をエクスポートするための巧妙なトリックです:

ste xyzzy=twisty 
startlocal 
set xyzzy=plugh 
endlocal && set xyzzy=%xyzzy% 

通常(&& xyzzy=...ビットなし、xyzzy変数がまだブロックした後、曲がりくねっの初期値になりますが、実際その%xyzzy%setendlocalコマンドの後actionedされている間、あなたが変更をエクスポートすることができます前に全体endlocal行を解釈されます。

あなたはset後に変数を解釈する場合、yは

cmd /v:on /c "set PATH=test && echo !PATH!" 

/v:onが遅れる拡張をオンにし、代わりに%!の使用は、あなたがその遅れ拡張を使用することを示しています。ouは遅延拡張を必要としています。

+0

遅延拡張が既に有効になっていると失敗します - [my answer](http://stackoverflow.com/a/8870200/1012053) – dbenham

1

あなたはimmediate expansion of variablesで噛まれています。

cmd.exeは、優れたスクリプト言語ではありません。

+0

cmd.exeはスクリプト言語ではありません。 –

2

親環境で遅延拡張が有効な場合、paxdiabloソリューションを使用すると機能しません。

簡単な解決策は、あなたが新しいCMD環境になるまでそれが遅れているように、拡張を脱出することである

@echo off 
setlocal enableDelayedExpansion 
rem !PATH! below will get expanded in parent batch environment 
cmd /v:on /c "set PATH=test && echo !PATH!" 

またはコマンドラインから

cmd /v:on 
rem !PATH! below will get expanded in parent batch environment 
cmd /v:on /c "set PATH=test && echo !PATH!" 

バッチファイルから。

cmd /v:on 
rem This works whether or not delayed expansion is enabled in the parent environment 
cmd /v:on /c "set PATH=test && echo ^!PATH^!" 

cmdは、親環境から遅延拡張状態を継承しないため、2番目のcmdで/ v:onが必要であることに注意してください。

関連する問題