2012-08-14 10 views
5

Ich habe eine Reihe von Linien in einer Batch-Datei (.bat) auf einem Windows-Rechner ausgeführt wird, zB:Redirect DOS Ausgang Nur wenn Ausgang ist

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

Manchmal gibt proj.exe nichts (leer) statt von nützlichen Daten. In diesen Fällen möchte ich keine Textdatei erzeugen, ist das etwas leicht machbar auf der Seite der Batch-Datei? Das aktuelle Verhalten ist, dass eine Textdatei immer erstellt wird, im Falle einer leeren Ausgabe ist es nur eine leere Datei.

+2

Nur [löschen Sie alle Dateien mit der Länge Null] [1]. Sie können diese Befehle mit den "Start" -Befehlen verschachteln. I.e. etwas wie: [1]: http://stackoverflow.com/questions/4176962/recursively-delete-0kb-files-using-windows-cmd – jpe

+0

@jpe - das scheint wie die einzig mögliche Antwort, wenn Sie wollen um es vollständig in DOS zu handhaben. Sie sollten es als Antwort posten, damit es als "richtig" markiert werden kann. –

+0

Stack Overflow änderte meine Antwort in einen Kommentar, weil es zu kurz war. Also habe ich ein wenig ausgearbeitet :) – jpe

Antwort

4

Die JpE-Lösung erfordert, dass Ihre übergeordnete Stapelverarbeitung über die abgeschlossenen Prozesse informiert ist, bevor die Größe der Ausgabedatei überprüft werden kann. Sie können die START/WAIT-Option verwenden, aber dann verlieren Sie den Vorteil der parallelen Ausführung.

Sie können die Tatsache verwenden, dass die Umleitung zu einer Datei fehlschlägt, wenn ein anderer Prozess die Ausgabe bereits an dieselbe Datei umgeleitet hat. Wenn Ihr Eltern-Batch erfolgreich zu ihnen umleiten kann, wissen Sie, dass alle gestarteten Prozesse abgeschlossen sind.

Sie wahrscheinlich sollte stderr auf Ihre Ausgabedatei umleiten sowie 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' ist' 0', 'stdout' ist' 1', 'stderr' ist' 2'. Aus Neugier, was ist der '9' Teil von' 9 >> %% F ('do? –

+0

Es ist die höchste Nummer unbenutzte Datei Handle für CMD.EXE verfügbar. Die Datei wird erstellt, und jede Ausgabe, die gesendet wird Das Datei-Handle wird in der Datei enden, aber unter normalen Umständen wird natürlich nie etwas dorthin gehen.Es sollte mit jedem der Datei-Handles 1-9 funktionieren, aber ich war nur vorsichtig. – dbenham

2

Nur delete all files with zero length. Edit:

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

Dann rufen Sie den Wrapper von Ihrem Master-Skript: die Tatsache anzupassen, dass start ohne die/WAIT-Flag zurückkehrt, bevor die prog.exe warten zu beenden, können Sie die folgende Wrapper-Skript progwrapper.bat für Ihre prog.exe erstellen

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

usw.

Wenn prog.exe eine GUI-Anwendung ist, dann sollten Sie einen start /B /WAIT prog.exe im progwrapper.bat haben.

+1

Das funktioniert, das einzige Problem ist, dass ich eine '/ wait'-Flagge auf meinem 'Start' setzen muss, weil ich sonst versuchen würde zu löschen, bevor sie generiert wurden. – user17753

+0

@ user17753 - Ja, Ihr Eltern-Batch müsste wissen, wann die Dateigröße überprüft werden muss. Ich arbeite an einer Antwort, die es mehreren Programmen ermöglicht, parallel zu laufen und die Größen nicht zu überprüfen, bis alle abgeschlossen sind. – dbenham