如何使Windows批处理脚本完全无声?

Mik*_*ler 40 windows cmd batch-file echo

几代人一直在问这个问题的变种,但是尽管写了一些相当复杂的Windows脚本,我似乎无法找到如何使它们真正沉默.

以下是我当前脚本之一的摘录:

@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
Run Code Online (Sandbox Code Playgroud)

结果是:

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

C:\Temp>
Run Code Online (Sandbox Code Playgroud)

而"1个文件被复制".只是很烦人,"找不到文件"让用户认为出了问题(它没有 - 没有文件没问题).

And*_*y M 74

要禁止输出,请使用重定向NUL.

控制台命令使用两种输出:

  • 标准输出,或stdout,

  • 标准错误,或stderr.

在这两者中,stdout更常用于内部命令,如copy控制台实用程序,外部命令,find以及其他命令,以及第三方控制台程序.

>NUL抑制标准输出并且工作正常,例如用于抑制命令的1 file(s) copied.消息copy.另一种语法是1>NUL.所以,

COPY file1 file2 >NUL
Run Code Online (Sandbox Code Playgroud)

要么

COPY file1 file2 1>NUL
Run Code Online (Sandbox Code Playgroud)

要么

>NUL COPY file1 file2
Run Code Online (Sandbox Code Playgroud)

要么

1>NUL COPY file1 file2
Run Code Online (Sandbox Code Playgroud)

抑制所有COPY的标准输出.

为了抑制错误消息,其通常打印到stderr,使用2>NUL代替.因此,要禁止在找不到指定文件时打印的File Not Found消息DEL,只需2>NUL在命令行的开头或结尾添加:

DEL file 2>NUL
Run Code Online (Sandbox Code Playgroud)

要么

2>NUL DEL file
Run Code Online (Sandbox Code Playgroud)

虽然有时在尝试删除文件之前实际验证文件是否存在可能是一个更好的主意,就像您在自己的解决方案中所做的那样.但请注意,您不需要使用循环逐个删除文件.您可以使用单个命令删除批次:

IF EXIST "%scriptDirectory%*.noext" DEL "%scriptDirectory%*.noext"
Run Code Online (Sandbox Code Playgroud)

  • `copy`不会将错误消息写入stderr,也会写入stdout.`copy ...> nul`将隐藏正常和错误输出.`xcopy`虽然做得对,但这可能是一个选择.(还设置`xcopy/q`选项以删除复制的文件名.) (3认同)

Aac*_*ini 11

如果您希望批处理脚本的所有正常输出都是静默的(如您的示例中所示),最简单的方法是使用重定向运行批处理文件:

C:\Temp> test.bat >nul
Run Code Online (Sandbox Code Playgroud)

此方法不需要修改脚本中的单行,它仍然在屏幕中显示错误消息.要压缩所有输出,包括错误消息:

C:\Temp> test.bat >nul 2>&1
Run Code Online (Sandbox Code Playgroud)

如果您的脚本具有生成您希望在屏幕中显示的输出的行,则可能更容易将重定向添加到这些线条而不是所有要保持静默的行:

@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
Run Code Online (Sandbox Code Playgroud)

安东尼奥