如何使 Windows 批处理脚本完全静默?

Posted

技术标签:

【中文标题】如何使 Windows 批处理脚本完全静默?【英文标题】:How do I make a Windows batch script completely silent? 【发布时间】:2013-01-19 03:04:51 【问题描述】:

这个问题的变种已经问了好几代了,但是尽管编写了一些相当复杂的 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 个文件”。只是烦人,“找不到文件”让用户认为出了点问题(它没有 - 没有文件很好)。

【问题讨论】:

如果您最终使用的解决方案与给出的解决方案不同,请添加您自己的答案并接受。不要将解决方案添加到问题本身。 我实际上已经设法删除了第二个“找不到文件”输出,方法是在它前面加上一个 if 条件: IF EXIST "%scriptDirectory%*.noext" FOR /F %%f IN ( 'dir /B "%scriptDirectory%*.noext"') DO (...这原本不起作用,因为我曾尝试使用 IF DO(). 我已更改标题以反映 @bobstein-visibone 的 [相当苛刻,恕我直言] 评论。 【参考方案1】:

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

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

标准输出,或stdout

标准错误,或stderr

在这两者中,stdout 的使用频率更高,既可以通过内部命令(例如 copy),也可以通过控制台实用程序或 外部 命令(例如 find 和其他命令)使用与第三方控制台程序一样。

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

COPY file1 file2 >NUL

COPY file1 file2 1>NUL

>NUL COPY file1 file2

1>NUL COPY file1 file2

抑制 COPY 的所有标准输出。

要抑制通常打印到stderr 的错误消息,请改用2>NUL。因此,要在找不到指定文件时抑制DEL 打印的File Not Found 消息,只需在命令行开头或结尾添加2>NUL

DEL file 2>NUL

2>NUL DEL file

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

IF EXIST "%scriptDirectory%*.noext" DEL "%scriptDirectory%*.noext"

【讨论】:

谢谢,@AndriyM - 我的实际脚本不仅仅是删除文件,而是为了这个问题而将其删除。如果我使用 1>NUL,这是否意味着仍然会显示错误消息?这将是一个进步。 @MikeSadler:是的,1>NUL 仅抑制标准输出。仍然会显示错误输出。当您需要抑制命令的所有输出时,请同时使用1>NUL2>NUL 太完美了——我很高兴用户看到错误消息(如果有的话)。 copy 不会将错误消息写入标准错误,但也会写入标准输出。 copy ... >nul 将隐藏正常和错误输出。 xcopy 做对了,所以这可能是一个选择。 (同时设置xcopy /q 选项以摆脱复制的文件名。) 应该是copy /y ...【参考方案2】:

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

C:\Temp> test.bat >nul

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

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

安东尼奥

【讨论】:

【参考方案3】:

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

例如,

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

【讨论】:

【参考方案4】:

您可以将 stdout 重定向到 nul 以隐藏它。

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

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

Here 你可以看到重定向标准流的所有不同方式。

【讨论】:

【参考方案5】:

以静默模式将名为 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

    /S 复制目录和子目录,空目录除外。

    /E 复制目录和子目录,包括空的 那些。与 /S /E 相同。可用于修改/T。

    /I 如果目标不存在并且复制多个 文件,假设目的地必须是一个目录。

    /Y 禁止提示确认您要覆盖 一个 现有目标文件。

【讨论】:

以上是关于如何使 Windows 批处理脚本完全静默?的主要内容,如果未能解决你的问题,请参考以下文章

inno setup静默安装的问题

如何调试静默崩溃?多处理 python

如何从 Windows 批处理执行驻留在 Oracle APEX 上的 SQL 脚本

如何使批处理文件自行删除?

如何在 Windows 上静默卸载 Python 2.7?

Windows 批处理脚本指南: 日志