web-dev-qa-db-ja.com

別のbatファイルからバックグラウンドでbatファイルを実行するにはどうすればよいですか?

朝に実行する「セットアップ」スクリプトがあり、必要なすべてのプログラムを起動します。これらのいくつかは環境の追加セットアップが必要なので、それらを小さなBATスクリプトでラップする必要があります。

このようなスクリプトをWindows XPバックグラウンドで実行するにはどうすればよいですか?

CALL env-script.batは同期的に実行します。つまり、セットアップスクリプトはenv-scriptのコマンドが終了した後にのみ続行できます。

START/B env-script.batは同じコマンドプロンプトでCMD.exeの別のインスタンスを実行し、非常に乱雑な状態のままにします(ネストされたCMD.exeの出力が表示され、キーボードがしばらく停止し、スクリプトは実行されません)。

START/B CMD env-script.batは同じ結果をもたらします。 CMDのフラグはどれも私の法案と一致しないようです。

84
Aaron Digulla

実際、以下は私にとってはうまく機能し、新しいウィンドウを作成します。

test.cmd:

@echo off
call "cmd /c start test2.cmd"
call "cmd /c start test3.cmd"
echo Foo
pause

test2.cmd

@echo off
echo Test 2
pause
exit

test3.cmd

@echo off
echo Test 3
pause
exit

新しいウィンドウを前面に表示したくない場合は、Mosheが指摘したように、/minなどのstartへのパラメーターと組み合わせてください。

67
Joey

2歳ですが、完全を期すために...

標準のインラインアプローチ:(つまり、Linuxで&を使用した場合の動作)

START /B CMD /C CALL "foo.bat" [args [...]]

注:1. CALLは通常.batファイルとペアになっています。これは、..(つまり、これは非同期にするためのCMD /C CALL "foo.bat"フォームの単なる拡張です。通常、正しくする必要があります。終了コードを取得しますが、ここでは問題ではありません。); 2. .batファイルを二重引用符で囲む必要があるのは、名前にスペースが含まれている場合のみです。 (名前はパスである可能性があり、その場合はその可能性が高くなります。).

出力が必要ない場合:

START /B CMD /C CALL "foo.bat" [args [...]] >NUL 2>&1

バットを独立したコンソールで実行したい場合:(つまり、別のウィンドウ)

START CMD /C CALL "foo.bat" [args [...]]

他のウィンドウを後でぶらぶらさせたい場合:

START CMD /K CALL "foo.bat" [args [...]]

注:通常、開いているウィンドウを通常のコンソールとして使用したいユーザーがいない限り、これは実際には貧弱なフォームです。出力を表示するためにウィンドウを固定したい場合は、batファイルの最後にPAUSEを追加することをお勧めします。または、まだ、コマンドラインの後に^& PAUSEを追加します。

START CMD /C CALL "foo.bat" [args [...]] ^& PAUSE
132
antak

STARTは、CMDスクリプトからバックグラウンドで何かを実行する唯一の方法であるため、引き続き使用することをお勧めします。/B修飾子の代わりに、/ MINを試して、新しく作成されたウィンドウが気にならないようにします。また、/ LOWまたは/ BELOWNORMALを使用して優先度を低く設定することもできます。これにより、システムの応答性が向上します。

7
Moshe

前景/背景用語以外。実行中のウィンドウを非表示にする別の方法は、システムでまだ使用可能な場合、vbscriptを使用することです。

DIM objShell
set objShell=wscript.createObject("wscript.Shell")
iReturn=objShell.Run("yourcommand.exe", 0, TRUE)

sth.vbsという名前を付けて、batから呼び出し、スケジュールされたタスクなどに入れます。

4
MeaCulpa

これは私のWindows XP Homeインストール、Unixの方法で動作します:

call notepad.exe & 
0
MiiToo

新しいC#Windowsアプリケーションを作成し、mainからこのメソッドを呼び出します。

public static void RunBatchFile(string filename)
{
    Process process = new Process();

    process.StartInfo.FileName = filename;

    // suppress output (command window still gets created)
    process.StartInfo.Arguments = "> NULL";

    process.Start();
    process.WaitForExit();
}
0
LegendLength

最後にこのオプションを使用すると、実際には非常に簡単です。

c:\ start BATCH.bat -WindowStyle Hidden

0
user8832474