2013-02-04 47 views
30

Đã có các biến thể của câu hỏi này được yêu cầu cho các thế hệ, nhưng mặc dù viết một số kịch bản Windows khá phức tạp, tôi dường như không thể tìm ra cách làm cho chúng thực sự im lặng.Làm cách nào để làm cho tập lệnh batch của Windows hoàn toàn im lặng?

Sau đây là một đoạn trích từ một trong những kịch bản hiện tại của tôi:

@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 

Kết quả của việc này là:

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

C:\Temp> 

Trong khi "1 file (s) sao chép." chỉ là gây phiền nhiễu, "File Not Found" làm cho người dùng nghĩ rằng có điều gì đó không ổn (mà nó không có - không có tệp nào là tốt).

+1

Nếu bạn đã sử dụng giải pháp khác với giải pháp đã cho, vui lòng thêm câu trả lời của riêng bạn và chấp nhận câu trả lời. Không thêm giải pháp vào câu hỏi. –

+0

Tôi đã thực sự quản lý để loại bỏ đầu ra "Không tìm thấy tệp" thứ hai bằng cách đặt trước nó với điều kiện if: IF EXIST "% scriptDirectory% *. Noext" FOR/F %% f IN ('dir/B "% scriptDirectory % *. noext "') DO (...Điều này ban đầu không hoạt động vì tôi đã cố gắng sử dụng IF DO(). –

+0

Tôi đã thay đổi tiêu đề để phản ánh nhận xét của [bobstein-visibone [khá khắc nghiệt, IMHO]. –

Trả lời

55

Để ngăn chặn đầu ra, sử dụng chuyển hướng đến NUL.

Có hai loại đầu ra giao diện điều khiển lệnh sử dụng:

  • đầu ra tiêu chuẩn, hoặc stdout,

  • sai số chuẩn, hoặc stderr.

Trong hai, stdout được sử dụng thường xuyên hơn, cả bởi lệnh nội bộ, như copy, và bởi giao diện điều khiển tiện ích, hoặc bên ngoài lệnh, như find và những người khác, cũng như các chương trình giao diện điều khiển của bên thứ ba .

>NUL ngăn chặn đầu ra tiêu chuẩn và hoạt động tốt, ví dụ: để ngăn chặn thông báo 1 file(s) copied. của lệnh copy. Cú pháp thay thế là 1>NUL. Vì vậy,

COPY file1file2>NUL 

hoặc

COPY file1file21>NUL 

hoặc

>NUL COPY file1file2 

hoặc

1>NUL COPY file1file2 

ngăn chặn tất cả các đầu ra tiêu chuẩn COPY 's.

Để chặn thông báo lỗi, thường được in thành stderr, hãy sử dụng 2>NUL để thay thế. Vì vậy, để ngăn chặn một thông điệp File Not Found rằng DEL in khi, tốt, các tập tin chỉ định không được tìm thấy, chỉ cần thêm 2>NUL hoặc ở đầu hoặc ở cuối dòng lệnh:

DEL file2>NUL 

hoặc

2>NUL DEL file 

Mặc dù đôi khi nó có thể là một ý tưởng tốt hơn để thực sự xác minh xem tệp có tồn tại hay không trước khi cố xóa nó, như bạn đang làm trong giải pháp của riêng bạn. Tuy nhiên, lưu ý rằng bạn không cần xóa từng tệp một, sử dụng vòng lặp. Bạn có thể sử dụng một lệnh duy nhất để xóa lô:

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

Cảm ơn, @AndriyM - tập lệnh thực tế của tôi không chỉ xóa tệp, nhưng tôi đã xóa nó xuống cho câu hỏi. Nếu tôi sử dụng 1> NUL, điều đó có nghĩa là các thông báo lỗi vẫn sẽ được hiển thị? Đó sẽ là một sự cải tiến. –

+1

@MikeSadler: Có, '1> NUL' chỉ loại bỏ đầu ra tiêu chuẩn. Lỗi đầu ra sẽ vẫn được hiển thị. Khi bạn cần chặn * tất cả * đầu ra cho một lệnh, sử dụng cả hai '1> NUL' và' 2> NUL' với nó. –

+0

thật hoàn hảo - Tôi rất vui khi người dùng thấy thông báo lỗi, nếu có. –

2

Bạn có thể chuyển hướng stdout tới nul để ẩn nó.

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

Chỉ cần thêm >nul vào lệnh bạn muốn ẩn đầu ra.

Here bạn có thể xem tất cả các cách chuyển hướng các luồng tiêu chuẩn khác nhau.

3

Chỉ cần thêm >NUL vào cuối dòng sản xuất thư.

Ví dụ,

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

8

Nếu bạn muốn rằng tất cả sản lượng bình thường của kịch bản Batch bạn im lặng (như trong ví dụ của bạn), cách dễ nhất để làm điều đó là để chạy các tập tin hàng loạt với chuyển hướng:

C:\Temp> test.bat >nul 

Phương pháp này không yêu cầu sửa đổi một dòng trong tập lệnh và vẫn hiển thị thông báo lỗi trên màn hình. Để đàn áp tất cả đầu ra, bao gồm cả các thông báo lỗi:

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

Nếu kịch bản của bạn có những dòng sản xuất đầu ra bạn muốn xuất hiện trong màn hình, có lẽ sẽ đơn giản hơn để thêm chuyển hướng đến những Lineas thay vì tất cả các dòng bạn muốn giữ im lặng:

@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 

Antonio

1

Sao chép một thư mục có tên html & tất cả nội dung của nó vào thư mục đích ở chế độ im lặng. Nếu thư mục đích không xuất hiện, nó vẫn sẽ tạo nó.

@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 Bản sao các thư mục và thư mục con, ngoại trừ những người có sản phẩm nào.

  2. /E Sao ​​chép thư mục và thư mục con, bao gồm cả trống rỗng . Tương tự như/S/E. Có thể được sử dụng để sửa đổi/T.

  3. /I Nếu đích không tồn tại và sao chép nhiều hơn một tệp , giả định đích đó phải là một thư mục.

  4. /Y Suppresses nhắc xác nhận bạn muốn ghi đè an tệp đích hiện tại.
Các vấn đề liên quan