web-dev-qa-db-ja.com

Windowsバッチスクリプトを完全にサイレントにする方法

何世代にもわたってこの質問のバリエーションがありましたが、いくつかの非常に複雑なWindowsスクリプトを書いたにもかかわらず、それらを実際にサイレントにする方法を見つけることができないようです。

以下は、現在のスクリプトの1つからの抜粋です。

@ECHO OFF
SET scriptDirectory=%~dp0
COPY %scriptDirectory%test.bat %scriptDirectory%test2.bat
FOR /F %%f IN ('dir /B "%scriptDirectory%*.noext"') DO (
del "%scriptDirectory%%%f"
)
ECHO

この結果は次のとおりです。

C:\Temp> test.bat
        1 file(s) copied.
File Not Found
Echo is off.

C:\Temp>

一方、「1個のファイルがコピーされました。」単に迷惑です。「ファイルが見つかりません」は、ユーザーに何かが間違っていると思い込ませます(それはそうではありません-ファイルは問題ありません)。

39
Mike Sadler

出力を抑制するには、NULへのリダイレクトを使用します。

コンソールコマンドが使用する出力には、次の2種類があります。

  • 標準出力、またはstdout

  • 標準エラー、またはstderr

この2つのうち、stdoutは、copyなどの内部コマンドとコンソールユーティリティ、またはfindなどのexternalコマンドの両方でより頻繁に使用されます。 、およびサードパーティのコンソールプログラムによる。

_>NUL_は標準出力を抑制し、正常に動作します。 copyコマンドの1 file(s) copied.メッセージを抑制するため。別の構文は_1>NUL_です。そう、

_COPY file1file2>NUL_

または

_COPY file1file21>NUL_

または

_>NUL COPY file1file2_

または

_1>NUL COPY file1file2_

COPYのすべての標準出力を抑制します。

通常stderrに出力されるエラーメッセージを抑制するには、代わりに_2>NUL_を使用します。そのため、指定されたファイルが見つからないときにDELが出力する_File Not Found_メッセージを抑制するには、コマンドラインの先頭または末尾に_2>NUL_を追加するだけです。

_DEL file2>NUL_

または

_2>NUL DEL file_

独自のソリューションで行っているように、削除しようとする前にファイルが存在するかどうかを実際に確認する方が良い場合もあります。ただし、ループを使用してファイルを1つずつ削除する必要はありません。 1つのコマンドを使用して、ロットを削除できます。

_IF EXIST "%scriptDirectory%*.noext" DEL "%scriptDirectory%*.noext"
_
71
Andriy M

(例のように)バッチスクリプトの通常の出力をすべてサイレントにしたい場合は、リダイレクトを使用してバッチファイルを実行するのが最も簡単な方法です。

C:\Temp> test.bat >nul

この方法では、スクリプトの1行を変更する必要はなく、画面にエラーメッセージが表示されます。 allエラーメッセージを含む出力を抑制するには:

C:\Temp> test.bat >nul 2>&1

画面に表示したい出力を生成する行がスクリプトにある場合、おそらく、沈黙させたいすべての行の代わりにthose lineasにリダイレクトを追加する方が簡単です:

@ECHO OFF
SET scriptDirectory=%~dp0
COPY %scriptDirectory%test.bat %scriptDirectory%test2.bat
FOR /F %%f IN ('dir /B "%scriptDirectory%*.noext"') DO (
del "%scriptDirectory%%%f"
)
ECHO
REM Next line DO appear in the screen
ECHO Script completed >con

アントニオ

11
Aacini

メッセージを生成する行の最後に>NULを追加するだけです。

例えば、

COPY %scriptDirectory%test.bat %scriptDirectory%test2.bat >NUL

3
Unknown

Stdoutをnulにリダイレクトして非表示にすることができます。

COPY %scriptDirectory%test.bat %scriptDirectory%test2.bat >nul

出力を非表示にするコマンドに>nulを追加するだけです。

ここ stdストリームをリダイレクトするさまざまな方法をすべて見ることができます。

2
Bali C

htmlおよびそのすべてのコンテンツという名前のディレクトリをサイレントモードで宛先ディレクトリにコピーします。宛先ディレクトリが存在しない場合でも、作成されます。

@echo off
TITLE Copy Folder with Contents

set SOURCE=C:\labs
set DESTINATION=C:\Users\MyUser\Desktop\html

xcopy %SOURCE%\html\* %DESTINATION%\* /s /e /i /Y >NUL

  1. / S空のものを除くディレクトリとサブディレクトリをコピーします。

  2. / E空のものも含めて、ディレクトリとサブディレクトリをコピーします。/S/Eと同じです。/Tを変更するために使用できます。

  3. / I宛先が存在せず、複数のファイルをコピーする場合、宛先はディレクトリである必要があると想定します。

  4. / Y既存の宛先ファイルを上書きすることを確認するプロンプトを抑制します。
1
Hamzeen Hameem