2017-03-10 6 views
0

ディレクトリをワークスペースディレクトリに変更してsetupEnv.batファイルを呼び出すことで、ワークスペースを設定するためのbatファイルを作成しました。しかし、PowerShellで以下のバットファイルを実行している間に、のコマンドの後の命令は実行されません。 cmdでsetupEnv.batファイルを呼び出す必要があります。 のコマンドを削除しても正常に動作します。しかし、PowerShellではなくcmdのsetupEnv.batを呼び出す必要があります。cmdに変更した後、バッチファイルを使用してbatファイルを呼び出すことができない

D: 
cd D:\WorkSpace\ 
cmd 
call setupEnv.bat 
echo "Setup Completed" 
  • CMDをsetupEnv.batを呼び出し、呼び出した後、それはPowerShellのすべての環境変数の設定を維持しますか?

答えて

0

あなたのPowerShellスクリプトには、このような何かを試してみてください。

& start "C:\Temp\test.bat" 
+0

バッチファイルで設定された変数は、プロセスが終了すると消えます。 –

0

CMDをsetupEnv.batを呼び出し、呼び出した後、それはPowerShellですべての環境変数の設定を維持しますか?

PowerShellから呼び出されたレガシーコマンドはすべて、別の(子)プロセスで実行されます。

証明

wmic process where "name='powershell.exe' or name='cmd.exe'" get CommandLine, name, ParentProcessId, ProcessId /Value 

は、例えば、あなたのバッチファイルに線の上に追加します。 setupEnv.batに電話し、それをpowershellから呼び出します。

  • D:\bat\setupEnv.bat
  • または呼び出し& call operator& D:\bat\setupEnv.bat
  • 又は. dot sourced& D:\bat\setupEnv.bat
  • または変更のすべて上記の方法を用いてcmd
  • cmd /D /C D:\bat\setupEnv.bat、又は
  • & cmd /D /C D:\bat\setupEnv.bat
  • 、又は
  • . cmd /D /C D:\bat\setupEnv.bat
      として。

結果は、少なくとも非常に似常に同じであるか:

PS D:\PShell> D:\bat\setupEnv.bat 
"Setup Completed" 

CommandLine="C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" 
Name=powershell.exe 
ParentProcessId=4280 
ProcessId=6396 

CommandLine=C:\Windows\system32\cmd.exe /c ""D:\bat\setupEnv.bat"" 
Name=cmd.exe 
ParentProcessId=6396 
ProcessId=4116 

this Foredecker's answer to similar questionから言い換え:

子プロセスが現在の環境変数を継承することができますが、 作業を子プロセスが親procに戻ることができる方法はありません親の環境を に変更してください。

ソリューションcmd /バッチスクリプトからではなくvice versa

+0

回避策は私の答えを見てください。 –

1

この記事では、あなたの正確なシナリオに対処するよりも、PowerShellを呼び出す:

Windows IT Pro - Take Charge of Environment Variables in PowerShell

変数が消える理由は、.bat.cmdは別のcmd.exeプロセスで実行されます(プロセスが終了すると、変数)。

記事あなたが.bat.cmdスクリプトを実行し、それが設定した環境変数を保持するために使用することができますPowerShellの機能を提供する:

# Invokes a Cmd.exe shell script and updates the environment. 
function Invoke-CmdScript { 
    param(
    [String] $scriptName 
) 
    $cmdLine = """$scriptName"" $args & set" 
    & $Env:SystemRoot\system32\cmd.exe /c $cmdLine | 
    Select-String '^([^=]*)=(.*)$' | 
    ForEach-Object { 
     $varName = $_.Matches[0].Groups[1].Value 
     $varValue = $_.Matches[0].Groups[2].Value 
     Set-Item Env:$varName $varValue 
    } 
} 

記事は、環境変数の値を設定し、復元するための機能のいくつかを持っていますPowerShellで。

+0

はい、私は子供の 'cmd'プロセスからの出力を受け取り、処理する方法を知っています。ソリューションを完成させるためのリンクをありがとう!しかし、私は '$ cmdLine =" "" $ scriptName "" $ args&set&echo CD =%CD% "'を変更し、その結果のコマンドを_adopt_子のカレントディレクトリにも追加します。 – JosefZ

関連する問題