64

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

4

5 回答 5

110

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

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

  • 标准输出,stdout

  • 标准误,或stderr.

在这stdout两者中,内部命令(如copy)和控制台实用程序或外部命令(如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消息,只需在命令行的开头或结尾添加:DEL2>NUL

DEL file 2>NUL

或者

2>NUL DEL file

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

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

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

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

安东尼奥

于 2013-02-04T18:41:59.847 回答
3

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

例如,

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

于 2013-02-04T12:05:37.790 回答
2

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

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

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

在这里,您可以看到重定向 std 流的所有不同方式。

于 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 回答