2013-02-04 22 views
30

這個問題已經有幾代人問過,但是儘管編寫了一些非常複雜的Windows腳本,我似乎無法找到如何使它們實際上保持沉默。如何使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檔(S)複製。」只是很煩人,「文件未找到」會讓用戶認爲出現了問題(它沒有 - 沒有文件是好的)。

+1

如果您最終使用了不同的解決方案,請添加您自己的答案並接受它。不要將解決方案添加到問題本身。 –

+0

我實際上設法刪除第二個「文件未找到」輸出的前綴加上if條件:IF EXIST「%scriptDirectory%*。noext」FOR/F %% f IN('dir/B「%scriptDirectory %*。noext「')DO(...這原本不起作用,因爲我試圖使用IF DO()。 –

+0

我已更改標題以反映@ bobstein-visibone [相當苛刻,恕我直言]的評論。 –

回答

55

爲了抑制輸出,使用重定向到NUL

有兩種輸出的該控制檯命令使用:

  • 標準輸出,或stdout

  • 標準誤差,或stderr

在這兩個,stdout由內部命令更多的時候,既所使用的,像copy,並通過控制檯實用程序或外部命令,如find和其他人,以及由第三方控制檯程序。

>NUL可以抑制標準輸出並且工作正常用於抑制copy命令的1 file(s) copied.消息。另一種語法是1>NUL。所以,

COPY file1file2>NUL 

COPY file1file21>NUL 

>NUL COPY file1file2 

1>NUL COPY file1file2 

抑制所有COPY的標準輸出。

要抑制通常打印到stderr的錯誤消息,請改爲使用2>NUL。因此,爲了抑制File Not Found消息DEL打印時,那麼,指定的文件沒有找到,只是無論是在開始或在命令行的末尾添加2>NUL

DEL file2>NUL 

2>NUL DEL file 

雖然有時候在嘗試刪除文件之前實際驗證文件是否存在可能是一個更好的主意,就像您在自己的解決方案中所做的那樣。但請注意,您不需要使用循環逐個刪除文件。您可以使用一個命令來刪除很多:

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

謝謝,@AndriyM - 我的實際腳本並不僅僅是刪除文件,但是我對這個問題進行了簡化。如果我使用1> NUL,這是否意味着錯誤信息仍然會顯示?這將是一個改進。 –

+1

@MikeSadler:是的,'1> NUL'只能抑制標準輸出。錯誤輸出仍將顯示。當你需要抑制* all *命令的輸出時,同時使用'1> NUL'和'2> NUL'。 –

+0

這是完美的 - 我很高興看到錯誤消息,如果有的話。 –

2

您可以將stdout重定向到nul以隱藏它。

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

只需添加>nul到要隱藏的輸出命令。

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

3

只需在產生消息的行末尾添加一個>NUL即可。

例如,

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

8

如果你想你的批處理腳本都正常輸出是沉默的(就像在你的榜樣),要做到這一點最簡單的方法是運行批處理文件與重定向:

C:\Temp> test.bat >nul 

此方法不需要修改腳本中的單個行,它仍然在屏幕上顯示錯誤消息。要剿所有輸出,包括錯誤消息:

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 

安東尼

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禁止提示確認要覆蓋 和 現有目標文件。