2011-01-15 6 views
1

Einfach gesagt, habe ich eine grundlegende Textfortschrittsanzeige in einer Windows XP/Windows 7 Batch-Datei, die direkt nach der Ausgabe eines Befehlszeilenprogramms schreibt, während es funktioniert, weil es nicht aussieht wie es etwas für etwas tut. Ich tue dies durch den Klappentext nach dem Befehl als solche Rohrleitungen:Zwei Zeilenumbrüche in einem echo-Befehl

app.exe -args "file"|echo Writing "file"... 

Daraus ergibt sich in etwa wie folgt:

 
_______________ 
|app for work | 
|ver:2 10/2009| 
|_____________| 
Writing "file"... 

Gibt es eine Möglichkeit eine neue Zeile zwischen dem Antrag der Ausgang zu rutschen und meine Ausgabe?

Dinge, die ich getan habe, und schlug fehl:

 
|echo.|echo 
|echo.|echo.|echo 
|echo.&echo.&echo 
|echo [alt+255/hex:FF/ÿ/EOL][same again] 
|echo -e \r\r (lol) 
|echo.. (nope!) 

Die & ‚s bis wahrscheinlich verzögert werden, nachdem die Anwendung macht seine Sache, und dann zu spät es ist ... Habe ich etwas verpasst? Ist es überhaupt möglich? Ich weiß, das ist nicht wirklich wichtig, aber ich bin sehr neugierig.

+0

Warum zum Teufel bist du sogar Piping 'App' Ausgabe in' Echo'? "echo" nimmt keine Eingaben, so dass das gesamte Konstrukt eher führungslos ist. – Joey

Antwort

1

Von Ihrem Beispiel, ich vermute, dass app.exe seine Ausgabe an Standardfehler tatsächlich sendet, anstatt die Standardausgabe . Sonst wäre seine Ausgabe an die Pipe gesendet worden und echo hätte es verschlungen.

Wie dies etwa:

app.exe -args "file" | (echo. & echo Writing "file") 
+0

Yup, das ist es! Funktioniert perfekt. Ich verstehe den Unterschied zwischen Befehlen in und außerhalb von Klammern noch nicht, aber offensichtlich ist es wichtig. Vielen Dank für Ihre Mühe. – Zandro

+0

... dämmerte es mir. In-Klammern-Befehle werden bis zum Ende durchgelesen, einschließlich des Trennens von Und-Zeichen innerhalb. Ich habs gewusst! – Zandro

0

Sie möchten Ihre zwei Echo-Befehle group:

app.exe -args "file" & (echo ""; echo Writing "file") 
+0

Ich denke, das OP verwendet Windows 'cmd.exe – thkala

+0

Danke für die Hilfe, aber ist das Bash Sprache? Im Windows-Batch wartet es, bis die App beendet wird und druckt: ""; echo Schreiben "Datei" – Zandro

+0

oops, du hast Recht, hier die falsche Shell zu verwenden. – bjelli

0

Was

echo -e "`app.exe -args \"file\"` \n Writing file" 
+0

Das ist alles schön und Unix-y, aber das OP verwendet Windows – thkala

+0

Ja, haha. Vielleicht die 'Syntax-Transfers? – ktm5124

+0

Entschuldigung, afaik Windows 'Echo ist Barebones. Ich habe versucht -e als Vernunfttest. – Zandro

1

Ok, es in Ihrem Fall mehr Probleme.

Normalerweise können Sie einen Zeilenvorschub mit einem kleinen Trick Echo

setlocal EnableDelayedExpansion 
set LF=^ 


rem Two empty lines are neccessary for the LF creation 
rem In the variable <lf> is one line feed character 
echo Line1!lf!Line2 
------ OUTPUT ----- 
Line1 
Line2 

Aber in Ihrem Fall funktioniert das nicht, weil das Rohr die verzögerten Expansion bricht.

Aber die Pipe wird mehr Probleme machen, da sie zwei asynchrone Tasks startet.

In reallity Ihre APP.EXE läuft als task1 und Echo Schreiben Datei läuft als task2. So kann es passieren, dass task2 wird vor task1 ausgeführt werden, würde die Ausgabe

app.exe -args "file" | (echo. & echo Writing "file") 

Writing "file"... 
_______________ 
|app for work | 
|ver:2 10/2009| 
|_____________| 

anstelle von

_______________ 
|app for work | 
|ver:2 10/2009| 
|_____________| 

Writing "file"... 

Sie können es testen (auf der cmdline)

echo one >&2 | echo two 

In die meisten Fälle die Ausgabe ist:

one 
two 

Aber nicht immer!

+0

Ich wollte Danke dafür sagen. Leider hatte ich nicht genug Ansehen. Bitte akzeptiere stattdessen meine ätherische Stimme! – Zandro