64

何世代にもわたってこの質問のバリエーションが求められてきましたが、非常に複雑な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つのファイルがコピーされました。」ただ面倒ですが、「ファイルが見つかりません」は、ユーザーに何かがうまくいかなかったと思わせます(そうではありません-ファイルがないのは問題ありません)。

4

5 に答える 5

110

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

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

  • 標準出力、またはstdout

  • 標準エラー、またはstderr

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

>NUL標準出力を抑制し1 file(s) copied.、コマンドのメッセージを抑制するなど、正常に機能しますcopy。別の構文は1>NULです。それで、

COPY file1 file2 >NUL

また

COPY file1 file2 1>NUL

また

>NUL COPY file1 file2

また

1>NUL COPY file1 file2

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

通常はに出力されるエラーメッセージを抑制するには、代わりstderrにを使用2>NULします。したがって、指定されたファイルが見つからない場合に出力されるFile Not Foundメッセージを抑制するには、コマンドラインの最初または最後に次のいずれかを追加するだけです。DEL2>NUL

DEL file 2>NUL

また

2>NUL DEL file

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

IF EXIST "%scriptDirectory%*.noext" DEL "%scriptDirectory%*.noext"
于 2013-02-04T12:32:36.163 に答える
12

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

C:\Temp> test.bat >nul

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

C:\Temp> test.bat >nul 2>&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
REM Next line DO appear in the screen
ECHO Script completed >con

アントニオ

于 2013-02-04T18:41:59.847 に答える
3

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

例えば、

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

于 2013-02-04T12:05:37.790 に答える
2

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

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

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

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

于 2013-02-04T12:05:14.593 に答える
1

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既存の宛先ファイルを上書きするかどうかの確認を求めるプロンプトを抑制します。
于 2015-09-28T06:57:20.677 に答える