Windows XP以降Windows:ウィンドウを表示せずにバックグラウンドでバッチファイルを実行するにはどうすればよいですか?


121

私はすでに同様の質問(Windowsの起動時にバッチファイルをバックグラウンドで実行する)に回答していることを知っていますが、今回はバッチを起動する必要があります。

  • 別のバッチから、
  • コンソールウィンドウを表示せずに、
  • すべての引数が非表示のバッチに渡されます。

最初のバッチはコンソールウィンドウで実行されます。ただし、2番目のバッチ(最初のバッチによって非同期に起動されたバッチ)にもコンソールウィンドウを表示したくありません。

私はそれだけを行うVBScriptスクリプトを思いついたので、他の人が参照できるようにそのスクリプトを回答に入れましたが、他のアイデアや解決策があれば、遠慮なく貢献してください。

注:Windowsコマンドプロセッサのコンソールウィンドウは、多くの人が実際には正しくないDOSウィンドウと呼んでいます。


回答ありがとうございます。私が理解していることから、スクリプトを非同期に呼び出して非表示モードで実行する必要がある場合:

  • すでにコンソールウィンドウにある2番目のスクリプトstart /bで十分です。
  • Windowsから、2番目のウィンドウをトリガーしなくても、私の解決策はまだ有効です。

別のバッチファイルからバッチファイルを起動していますか?このすでに実行中のバッチファイルにはウィンドウがありますか?
2008年

はい、この別の(最初の)バッチはDOSウィンドウで実行されます。ただし、2番目のバッチ(非同期で最初のバッチで起動)にもウィンドウが表示されないようにします( 'start / b'コマンドで発生します)
VonC

回答:


53

非同期で実行する2番目のバッチファイルが必要ですか。通常、1つのバッチファイルはcallコマンドと同期して別のバッチファイルを実行し、2番目のバッチファイルは最初のバッチファイルを共有します。

あなたは、することができます使用start /b second.bat第二のバッチファイルを起動するようにその株式あなたの最初の1のウィンドウ最初から同期を。両方のバッチファイルが同時にコンソールに書き込む場合、出力は重複し、おそらく判読できません。また、2番目のバッチファイルの最後にコマンドを配置するか、すべてが完了したら2番目のシェル内に移動します。exitcmd


1
正しい。start / bが新しいウィンドウを開くと信じていましたが、DOSウィンドウから実行した場合、同じウィンドウを共有します。
VonC 2008年

110

これが可能な解決策です:

最初のスクリプトから、次の行で2番目のスクリプトを呼び出します。

wscript.exe invis.vbs run.bat %*

実際、次のコマンドでvbsスクリプトを呼び出しています。

  • [パス] \スクリプトの名前
  • スクリプトに必要な他のすべての引数(%*

次に、invis.vbsはWindows Script Host Run()メソッドを使用してスクリプトを呼び出します。

  • intWindowStyle:0は「非表示ウィンドウ」を意味します
  • bWaitOnReturn:falseは、最初のスクリプトが2番目のスクリプトが完了するのを待つ必要がないことを意味します

これがinvis.vbsです。

set args = WScript.Arguments
num = args.Count

if num = 0 then
    WScript.Echo "Usage: [CScript | WScript] invis.vbs aScript.bat <some script arguments>"
    WScript.Quit 1
end if

sargs = ""
if num > 1 then
    sargs = " "
    for k = 1 to num - 1
        anArg = args.Item(k)
        sargs = sargs & anArg & " "
    next
end if

Set WshShell = WScript.CreateObject("WScript.Shell")

WshShell.Run """" & WScript.Arguments(0) & """" & sargs, 0, False

3
2kビューと素晴らしい投稿+回答、もっと多くの人がこのスレッドに投票する必要がある
Ric Tokyo

素晴らしいソリューション、まさに私が必要としていたもの。
nikhil

唯一の問題は、これが「cmd.exe」という名前のプロセスを作成することです。これは、今後見つけるのが困難です。
Aditya Gupta

12

バッチファイルをexeに変換します。Bat To Exe ConverterまたはオンラインBat To Exe Converter 試して、それをゴーストアプリケーションとして実行するオプションを選択します。


3
可能ですが、このインスタンスでは余分なステップを回避するように努めます。
VonC 2008年

21
私は通常その偏執狂ではありませんが、誰かに匿名でそのexeを生成させるのはとても愚かではありませんか?あらゆる種類の悪意のあるものが挿入される可能性があります。
トビアス

9

これは、DOSウィンドウを開かずにバッチファイルを実行する最も簡単で最短の解決策だと思います。一連のコマンドを定期的に実行するようにスケジュールしたい場合、非常に煩わしいので、DOSウィンドウがポップアップし続けます。これが解決策です。 。VBSスクリプトを使用してバッチファイルを呼び出す...

Set WshShell = CreateObject("WScript.Shell" ) 
WshShell.Run chr(34) & "C:\Batch Files\ mycommands.bat" & Chr(34), 0 
Set WshShell = Nothing 

上記の行をエディターにコピーし、ファイルを.VBS拡張子で保存します。.BATファイルの名前とパスを適宜編集します。


1
興味深いアプローチ、確かに私のソリューションよりも短いです。+1
VonC 2014年

素晴らしいソリューション。これを読んで私は本当に使用する必要がないことに気づきましたSet WshShell = Nothing、私にとってはうまく働きました、そしてあなたはそれを行うためのさらに小さな方法を持つことができます。
Patrick Bard 14

7

これを実現するための私の方法のコレクションを以下に示します-さらに、私は開始されたプロセスのPIDも返そうとした可能性があります(リンクされたスクリプトはすべて、ダウンロードして任意の名前で保存できます)。

1)IEXPRESSソリューションは、古いwin 95/98マシンでも使用できます。Iexpressは、Windowsにまだパッケージされている非常に古いツールです-引数はコマンドとその引数のみを受け入れます。

使用例:

call IEXPhidden.bat "cmd /c myBat.bat"  "argument"

2)SCHTASKS-ここでも、コマンドと引数の2つの引数のみを受け入れます。昇格されたアクセス許可で開始されているかどうかを確認し、可能であればWEVTUTILでプロセスのPIDを取得します(Vista以降で利用可能)。 PID)コマンド。

使用例:

call SCHPhidden.bat "cmd /c myBat.bat"  "argument"

3)「WScript.Shell」 -スクリプトは「WScript.Shell」の完全なラッパーであり、すべての可能なオプションはコマンドラインオプションを介して設定できます。これはjscript / batchハイブリッドであり、バットとして呼び出すことができます。

使用例(詳細については、「-h」を使用してヘルプを印刷してください):

call ShellRunJS.bat "notepad.exe" -style 0 -wait no 

4)'Win32_ProcessStartup'-再び完全なラッパーとすべてのオプションにコマンドライン引数を介してアクセスできます。今回は、いくつかのJscriptといくつかのVBScriptコードを含むWSF /バッチハイブリッドですが、開始されたプロセスのPIDを返します。プロセスがX / Y座標などの一部のオプションを使用できます(すべての実行可能ファイルに適用できるわけではありませんが、たとえばcmd.exeは座標を受け入れます)。

使用例(詳細については、「-h」を使用してヘルプを印刷してください):

call win32process.bat "notepad" -arguments "/A openFile.txt"  -showWindows 0 -title "notepad"

5)。NETソリューション。ProcessStartInfoオプションのほとんどのオプションが使用されます(ただし、結局、すべてを含めるには疲れすぎました)。

使用例(詳細については、「-h」を使用してヘルプを印刷してください):

call ProcessStartJS.bat "notepad" -arguments "/A openFile.txt"  -style Hidden -directory "." -title "notepad" -priority Normal

2

他の質問で私はautoexntを提案しました。これはこの状況でも可能です。サービスを手動で実行するように設定するだけです(つまり、起動時に自動ではありません)。バッチを実行する場合は、autoexnt.batファイルを変更して、必要なバッチファイルを呼び出し、autoexntサービスを開始します。

これを開始するバッチファイルは、次のようになります(テストされていません)。

echo call c:\path\to\batch.cmd %* > c:\windows\system32\autoexnt.bat
net start autoexnt

この方法で開始されたバッチファイルはシステムユーザーとして実行されることに注意してください。つまり、ネットワーク共有に自動的にアクセスすることはできません。ただし、net useを使用してリモートサーバーに接続できます。

入手するには、Windows 2003リソースキットダウンロードする必要があります。リソースキットは、Windows XPなどの他のバージョンのウィンドウにもインストールできます。


1
興味深いですが、このシナリオでは行き過ぎです。
VonC、2008年

2

「runas」を使用するか、Windowsスケジュールタスクで別のユーザーの下でスケジュールすることにより、別のユーザー名で実行します。


可能ですが、正確ではありません(バックグラウンドでの直接非同期呼び出し)
VonC 2008年

0

.batファイルは.vbsファイルから実行できます。
次のコードを.vbsファイルにコピーします。

Dim WshShell
Dim obj
Set WshShell = WScript.CreateObject("WScript.Shell") 
obj = WshShell.Run("C:\Users\file1.bat", 0) 
obj = WshShell.Run("C:\Users\file2.bat", 0)  and so on
set WshShell = Nothing 

0

あなたも使うことができます

start /MIN notepad.exe

PS:残念ながら、最小化されたウィンドウのステータスは、実行するコマンドによって異なります。VGが機能しない

start /MIN calc.exe
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.