这个问题有几代人的问题,但是尽管写了一些非常复杂的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个文件被复制”。只是很烦人,“找不到文件”让用户认为出了问题(它没有 - 没有文件可以正常使用)。
答案 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
/ S复制除空的目录和子目录。
/ E复制目录和子目录,包括空 那些。与/ S / E相同。可用于修改/ T.
/ I如果目的地不存在且复制多个 文件,假定目标必须是目录。