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


90

朝に実行する「セットアップ」スクリプトがあり、必要なすべてのプログラムを開始します。これらのいくつかは環境の追加設定が必要なので、小さな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のどのフラグも私の請求書と一致しないようです。

回答:


71

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

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が指摘したstartように、とのパラメーターを組み合わせ/minます。


1
これは機能しますが、100%完璧ではありません。「テスト2」で「RETURN」を押した後、ウィンドウが閉じません。何か案は?
Aaron Digulla 2009年

生成されたバッチに「exit」を追加して、後でそれらを閉じることができます。申し訳ありませんが、これまでテストしていませんでした:)
Joey

140

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

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

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

注:1. CALL.batファイルとペアになっています。これは通常、.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 [...]]

注:開いたウィンドウを通常のコンソールとして使用したいユーザーがいない限り、これは実際には不適切な形式です。出力を表示するためにウィンドウを固定したい場合PAUSEは、batファイルの最後にa を付けた方がよいでしょう。または、まだ、^& PAUSEコマンドラインの後に追加します:

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

10
&「それから」(用語?)演算子です。(たとえばcmd1 & cmd2、「cmd1」を&&実行してから「cmd2」を実行することを意味します。演算子とは異なり、「cmd2」の実行は「cmd1」の正常終了に依存しません。)^エスケープして、&消費される代わりにCMDの引数に入るSTARTを実行したのと同じコンソールで実行します。
antak '12

これは非常に役に立ちます。ありがとうございます。他のガイドので、私は、ちょうどポートをLinuxにいくつかのスクリプトとしていたstartとはcmd、私が求める完全な機能を与えませんでした。あなたの答えはそれを釘付けにします。
イテレータ

3
出力が必要ない場合は、リダイレクトをエスケープして、CMDに渡されるようにする必要があります。また、CALLは必要ありません:START /B "" CMD /C "foo.bat" [args [...]] ^>nul 2^>^&1
dbenham

1
@dbenham:あなたが言っていることは理にかなっていますが、START /B "" CMD /C PING 127.0.0.1 >NUL関係なく機能しているようで、何も出力されません。(おそらく、のI / OハンドルをCMD継承しているためSTARTです。)違いは、STARTの(エラー)出力をそのまま保持するかどうかです。これは、おそらく良い考えです。 CALL維持するのは良い習慣だと感じたので、そこにあります。(つまりCALL同期 bat呼び出しに使用しないと、予測できない終了コードが発生するためCALL、この場合のように厳密に適用されない場合でも、bat呼び出しと一貫してペア
リングし

7

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


-1問題は、BATファイルを開始したときにSTARTが新しいウィンドウを作成しないことです。代わりに、現在のウィンドウを再利用し、I / Oと2つのCMDプロセスを混合します。
アーロンディグラ2009年

4
/ Bフラグを使用しているため、新しいウィンドウは作成されません。それを除く。
Moshe

5

前景/背景用語以外。実行中のウィンドウを非表示にするもう1つの方法は、vbscriptを使用する方法です(システムで引き続き使用できる場合)。

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

sth.vbsと名前を付けて、バットから呼び出したり、スケジュールされたタスクに入れたりします。個人的には、管理しているWindowsシステムでvbsを無効にします。


私の特定のユースケースでは、これが実際に私が実行できる唯一のソリューションでした...
Ben

0

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

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();
}

2
うーん... Visual Studioをインストールする必要がないようなシンプルなものを望んでいました...
Aaron Digulla 2009年

1
PowerShellが100%使用可能になるまで-C#は過剰です。
ジム

2
Aaron:C#コンパイラは.NET Framework 2に含まれているため、テキストエディターでコードを編集してコンパイルするだけです。それでも、これはバッチファイルで完全に可能であるため、C#はやりすぎだとも言えます。
ジョーイ

0

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

call notepad.exe & 

7
これは偶然にしか機能しないと思います。&は必要ありません。
Sam Watkins

2
うん、notepad.exeはそもそも非同期です。
antak '25年

0

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

c:\ start BATCH.bat -WindowStyle Hidden


Windowsコマンドにstart-WindowStyleオプションがありません。
ステファン

@Stephan Arreed。奇妙なパス(C:` instead of C:\ Windows`)は、インターネット上のどこかでツールを見つけ、ハードドライブにコピーしたことを示唆しています。
アーロンディグラ2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.