web-dev-qa-db-ja.com

ウィンドウなしでスケジュールされたタスクで.batファイルを実行する

robocopyを毎時間実行するバッチスクリプトを開始するスケジュールされたタスクがあります。それが実行されるたびに、私は本当に見たくないrobocopyの出力を含むウィンドウがデスクトップにポップアップします。

スケジュールされたジョブを実行することにより、ウィンドウを最小化して表示することができました

cmd /c start /min mybat.bat

しかし、それによって毎時間新しいコマンドウィンドウが表示されます。 cmd /c「文字列で指定されたコマンドを実行してから終了する」とすると、これには驚きました-ドキュメントを誤解していたに違いありません。

コマンドウィンドウをポップアップせずにバッチスクリプトを実行する方法はありますか?

144
Tom Dunham

代わりに、Windowsスクリプトファイルを使用してサイレントで実行できます。 Runメソッドを使用すると、非表示モードでスクリプトを実行できます。 .vbsこのようなファイル

Dim WinScriptHost
Set WinScriptHost = CreateObject("WScript.Shell")
WinScriptHost.Run Chr(34) & "C:\Scheduled Jobs\mybat.bat" & Chr(34), 0
Set WinScriptHost = Nothing

それをスケジュールします。この例の2番目の引数は、ウィンドウスタイルを設定します。 0は「ウィンドウを隠す」ことを意味します。

メソッドの実行 の完全な構文:

 object.Run(strCommand, [intWindowStyle], [bWaitOnReturn])

引数:

  • オブジェクト:WshShellオブジェクト。
  • strCommand:実行するコマンドラインを示す文字列値。実行可能ファイルに渡すパラメーターを含める必要があります。
  • intWindowStyle:オプション。プログラムのウィンドウの外観を示す整数値。すべてのプログラムがこの情報を利用するわけではないことに注意してください。
  • bWaitOnReturn:オプション。スクリプトがプログラムの実行が完了するのを待ってから、スクリプト内の次のステートメントに進むかどうかを示すブール値。 trueに設定すると、プログラムが終了するまでスクリプトの実行が停止し、Runはプログラムから返されたエラーコードを返します。 false(デフォルト)に設定すると、Runメソッドはプログラムの起動直後に戻り、自動的に0を返します(エラーコードとして解釈されません)。
145
splattne

これをスケジュールされたタスクとして実行していますか?その場合、別のユーザーアカウントとして実行するように設定すると、ログオンしているユーザーには表示されません。スクリプトがWindows認証を必要とするアイテム(ファイル共有やプリンターなど)へのネットワークアクセスを必要としない場合は、「ntauthority\system」として実行し、パスワードを空白のままにすることができます。 Windows 7では、ユーザーをSYSTEMに設定し、OKを押します。

(robocopyを使用している場合は、おそらく実際のユーザーを使用する必要があります...)

JR

59
John Rennie

スケジュールされたタスクを「ユーザーがログオンしているかどうかにかかわらず実行する」に設定するだけです。

29
Peter Meinl

CHP(隠しプロセスの作成) を試してみることもできます。

CHP.EXE mybat.bat

コマンドウィンドウなしで実行します。パーフェクト! CMDOWと同じ人々によって作成されましたが、これはより適切です。

18
rocketmonkeys

[〜#〜] cmdow [〜#〜] は、コマンドラインからウィンドウに対して多くのことを実行できる、便利なツールです。

最も簡単なことの1つは、現在のウィンドウを(通常、batファイルの最初の行として)非表示にすることです。

cmdow @ /hid

またはで新しい隠しプロセスを開始します

cmdow /run /hid mybat.bat 
9
itsadok

スクリプトを呼び出してみてください

start /b <command>
5
rashfeather

バッチファイルへのショートカットを作成し、ショートカットを最小化して開始するように設定し(ショートカットのプロパティの[ショートカット]タブで)、ショートカットを開始するようにジョブを設定できます。

重要:[実行]テキストフィールドにショートカットのパスを手動で入力し、拡張子「.lnk」を付けて指定する必要があります。単に参照しようとすると、役立つショートカットが指すものにリダイレクトされます。

5
Doug Kavendek

この質問は、Windowsにネイティブで完全に適切な解像度で既に回答されているため、最も互換性があるはずであり、完全に同意します。

また、@ splattneのコメントには同意しませんが(実際の回答ではありません)、他の参照されているスレッドでの解決策は信用に値します。その答えには、別のユーザー(SYSTEM)としてスクリプトを実行することが含まれます。これは、スクリプトにルートアクセス権を与えることとほぼ同じです。また、ROBOCOPY(John Rennieが参照)などのネットワークアクセスを必要とするジョブの場合も失敗します。

これまでにCMDOWを試したことはありませんが、他の同様の解決策を提供したいと思います。[Windowsにはネイティブインストールされていません]は、ほとんどのバージョンに移植性が高く、32ビットバージョンと64ビットバージョンの両方があり、は NirCmd です。

NirCmdは無数のオプションを備えた非常に強力なツールであり、その中で最も有用なものは、次のコマンドを実行するだけで非表示のコマンドウィンドウを起動できることです。

c:\path\to\nircmd.exe exec hide "c:\path\to\mybat.bat"

The NirCmd Command Referenceexecセクションから:

exec [show/hide/min/max] [application + command-line]

アプリケーションを実行し、オプションで、実行されたアプリケーションの1つ以上のコマンドラインパラメータを指定します。 [show /hide/ min/max]パラメーターは、実行中のアプリケーションを表示するかどうかを指定します。 'hide'を指定すると、実行中のアプリケーションはユーザーに表示されません。 'max'を指定すると、実行中のアプリケーションウィンドウが最大化されます。 「min」を指定すると、実行中のアプリケーションウィンドウが最小化されます。

EDIT:ROBOCOPYジョブを実行しようとしてこの回答でメソッドを試しましたが、ネットワークアクセス権限を編集した後でも機能しませんでした。スクリプトをダブルクリックしてみましたが、機能しませんでしたが、昇格されたコマンドプロンプトで実行することしかできませんでした。私はバッチファイルへのショートカットを作成し、それを管理者として実行させ、ダブルクリックして実行させることができましたが、最終的にはSYSTEMとして非表示で実行することでした(わかっています、わかっています) -しかし、バッチファイルに適切な権限がある限り、ROBOCOPYで機能します。

EDIT 2:なんらかの理由でSYSTEM(おそらく先に参照したネットワークアクセスのこと)として機能しません-実際にROBOCOPYを実行した後、これに気付きました/ Lフラグなし。これは基本的に単なるシミュレーションであり、[見かけ上]実際にはリモートシステムに接続していませんが、最高の権限でバッチファイルを実行し、非表示のボックスをチェックすると、それを次のように実行できます。これは誰にとっても価値があるもののために、コマンドウィンドウを表示せずにバックグラウンドでログインしているユーザー。

1
rubynorails

私が使用した別のソリューションは Hidden Start です。

0
SteveC