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

时间:2013-02-04 12:01:00

标签: windows batch-file cmd 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

结果是:

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

C:\Temp>

而“1个文件被复制”。只是很烦人,“找不到文件”让用户认为出了问题(它没有 - 没有文件可以正常使用)。

5 个答案:

答案 0 :(得分:67)

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

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

  • 标准输出,或stdout

  • 标准错误,或stderr

在这两者中,stdout更常用于内部命令,如copy,控制台实用程序或外部命令,如{{1}和其他人,以及第三方控制台程序。

find会抑制标准输出并且工作正常,例如用于抑制>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打印的时间,以及找不到指定的文件,只需在命令行的开头或结尾添加DEL:< / p>

2>NUL

DEL file 2>NUL

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

2>NUL DEL file

答案 1 :(得分:10)

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

C:\Temp> test.bat >nul

此方法不需要修改脚本中的单行,但仍会在屏幕中显示错误消息。要压缩 all 输出,包括错误消息:

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

如果您的脚本包含产生您希望显示在屏幕上的输出的行,则可能更容易将重定向添加到那些 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

安东尼奥

答案 2 :(得分:3)

只需在产生消息的行末尾添加>NUL

例如,

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

答案 3 :(得分:2)

您可以将标准输出重定向到nul以隐藏它。

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

只需将>nul添加到要隐藏输出的命令中。

Here你可以看到重定向std流的所有不同方法。

答案 4 :(得分:1)

复制名为 html 的目录&amp;所有内容都以静默方式到达目标目录。 如果目标目录不存在,它仍将创建它。

@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禁止提示您确认是否要覆盖 一个                   现有目的地档案。