2012-08-14 36 views
5

tôi có một loạt các dòng trong một tập tin batch (.bat) đang chạy trên một máy tính Windows, ví dụ:Redirect DOS Output nếu có Output

start /b prog.exe cmdparam1 cmdparam2 > test1.txt 
start /b prog.exe cmdparam1 cmdparam2 > test2.txt 

Đôi khi proj.exe trả về không có gì (trống) thay vì dữ liệu hữu ích. Trong những trường hợp tôi muốn không tạo ra một tập tin văn bản, điều này là một cái gì đó dễ dàng có thể thực hiện trên các tập tin hàng loạt bên của sự vật? Hành vi hiện tại là một tệp văn bản luôn được tạo, trong trường hợp đầu ra trống nó chỉ là một tệp trống.

+2

Chỉ cần [xóa tất cả các file với số không dài] [1]. Bạn có thể xen kẽ các lệnh đó bằng lệnh "bắt đầu". I E. một cái gì đó như: [1]: http://stackoverflow.com/questions/4176962/recursively-delete-0kb-files-using-windows-cmd – jpe

+0

@jpe - dường như câu trả lời duy nhất có thể nếu bạn muốn để xử lý hoàn toàn trong DOS. Bạn nên đăng nó như một câu trả lời để nó có thể được đánh dấu 'đúng'. –

+0

Stack Overflow đã thay đổi câu trả lời của tôi thành nhận xét vì nó quá ngắn. Vì vậy, tôi xây dựng một chút :) – jpe

Trả lời

4

Giải pháp jpe yêu cầu lô cha mẹ của bạn phải biết khi quá trình bắt đầu hoàn tất trước khi nó có thể kiểm tra kích thước tệp đầu ra. Bạn có thể sử dụng tùy chọn START/WAIT, nhưng sau đó bạn mất lợi thế khi chạy song song.

Bạn có thể sử dụng thực tế là chuyển hướng đến một tệp sẽ thất bại nếu một quá trình khác đã chuyển hướng đầu ra đến cùng một tệp đó. Khi lô cha mẹ của bạn có thể chuyển hướng đến chúng thành công thì bạn biết rằng các quá trình bắt đầu đã hoàn tất.

Bạn có lẽ nên chuyển hướng stderr đến tập tin đầu ra của bạn cũng như stdout

@echo off 

::start the processes and redirect the output to the ouptut files 
start /b "" cmd /c prog.exe cmdparam1 cmdparam2 >test1.txt 2>&1 
start /b "" cmd /c prog.exe cmdparam1 cmdparam2 >test2.txt 2>&1 

::define the output files (must match the redirections above) 
set files="test1.txt" "test2.txt" 

:waitUntilFinished 
:: Verify that this parent script can redirect an unused file handle to the 
:: output file (append mode). Loop back if the test fails for any output file. 
:: Use ping to introduce a delay so that the CPU is not inundated. 
>nul 2>nul ping -n 2 ::1 
for %%F in (%files%) do (
    9>>%%F (
    rem 
) 
) 2>nul || goto :waitUntilFinished 

::Delete 0 length output files 
for %%F in (%files%) do if %%~zF==0 del %%F 
+0

'stdin' là' 0', 'stdout' là' 1', 'stderr' là' 2'. Ngoài sự tò mò, phần '9' của' 9 >> %% F ('do? –

+0

Đây là số xử lý tệp không được sử dụng nhiều nhất có sẵn cho CMD.EXE. Tệp này được tạo và bất kỳ đầu ra nào được gửi đến tập tin đó sẽ kết thúc trong tập tin, nhưng tất nhiên không có gì sẽ đi đến đó trong hoàn cảnh bình thường.Nó nên làm việc với bất kỳ tập tin xử lý 1-9, nhưng tôi đã được chỉ thận trọng. – dbenham

2

Chỉ delete all files with zero length. Chỉnh sửa: để thích ứng với thực tế là start mà không có lợi nhuận/WAIT cờ trước khi chờ đợi prog.exe chấm dứt, bạn có thể tạo ra các kịch bản wrapper sau progwrapper.bat cho prog.exe của bạn:

prog.exe "%1" "%2" > "%3" 
if %~z3==0 del "%3" 

Sau đó gọi wrapper từ kịch bản tổng thể của bạn:

start /b progwrapper.bat cmdparam1 cmdparam2 > test1.txt 
start /b progwrapper.bat cmdparam1 cmdparam2 > test2.txt 

, vv

Nếu prog.exe là một ứng dụng GUI, sau đó bạn nên có một start /B /WAIT prog.exe trong progwrapper.bat.

+1

Điều này làm việc, chỉ có vấn đề là tôi sẽ phải đặt trong một cờ '/ wait' trên' start' của tôi bởi vì nếu không tôi sẽ cố gắng xóa trước khi chúng được tạo ra. – user17753

+0

@ user17753 - Có, nhóm cha mẹ của bạn sẽ phải biết khi nào kiểm tra kích thước tệp. Tôi đang làm việc trên một câu trả lời mà sẽ cho phép nhiều chương trình chạy song song và không kiểm tra các kích cỡ cho đến khi tất cả được hoàn thành. – dbenham

Các vấn đề liên quan