echo fügt bei Verwendung mit einer Pipe Platz hinzu

8

Bei der Beantwortung dies Frage Ich habe ein seltsames Verhalten gefunden, für das ich keine Erklärung habe

%Vor%

Sie sehen die Nummern 10..100, fügen Sie jetzt einfach die Pipe hinzu, z. zu sort oder more , was auch immer:

%Vor%

Es werden Leerzeichen zwischen %a und 0 hinzugefügt! Sieht aus, als würde etwas, das durch eine Pipe erzeugt wird, ein nachkommendes Leerzeichen hinzufügen, das man leicht sehen kann:

%Vor%

und sogar

%Vor%

(verwendet wahrscheinlich das Echo zum Drucken der Eingabeaufforderung)

Dies passiert nicht, wenn es keine Ausgabeumleitung gibt (egal ob in eine Datei oder für einen Befehl). Ist es ein Käfer oder fehle ich etwas? Wie werde ich den Raum los? (abgesehen von dem schmutzigen Hack des Abstreifens des letzten Zeichens mit var:~0,-1 )

    
panda-34 08.06.2012, 12:25
quelle

2 Antworten

7

Ausgezeichnete und interessante Frage (+1)

Der Raum wird durch den Pipe-Mechanismus des CMD-Parsers eingeführt, nicht durch SORT.

Wenn Sie einen Befehl mit FOR / F ausführen, wird der Befehl in einer eigenen CMD-Shell ausgeführt. Außerdem wird jede Seite einer Pipe in ihrer eigenen CMD-Shell ausgeführt. Weitere Informationen finden Sie unter Warum tritt die verzögerte Erweiterung in einem Pipe-Codeblock auf? .

So instantiiert Ihr Befehl tatsächlich 3 CMD-Shells, eine für den FOR / F-Befehl, die wiederum 2 für jede Seite der Pipe erstellt.

Sie können sehen, wie die Befehle mit der dynamischen Variable% CMDCMDLINE% analysiert und in die CMD-Shell eingefügt werden. Da wir den Befehl über die Befehlszeile ausführen, müssen wir mindestens ein Zeichen im Variablennamen zweimal zurückgeben, damit er nicht erweitert wird, bis er die innerste CMD-Shell erreicht.

Hier ist der Befehl mit den Ergebnissen (die führende > ist meine Eingabeaufforderung):

%Vor%

Die letzte Zeile der Ausgabe ist die Befehlszeile, die für die linke Seite der Pipe verwendet wird. Sie können sehen, wie der Parser an mehreren Stellen Leerzeichen eingefügt hat.

Sie können das Problem umgehen, indem Sie ein einfaches Batch-Skript verwenden, um den Wert anstelle des ECHO-Befehls zu übernehmen.

echoArgs.bat

%Vor%

Wenn Sie jetzt diesen Befehl ausführen, erhalten Sie das gewünschte Ergebnis

%Vor%

Eine weitere Methode zur Umgehung des Problems besteht darin, eine Variable mit Ihrem ECHO-Befehl zu erstellen und die Expansion der Variablen entsprechend zu umgehen.

%Vor%

BEARBEITEN

Das >_tempfile echo and here's a space|more Beispiel ist ebenfalls interessant. Am Ende der Ausgabedatei befindet sich ein zusätzlicher Speicherplatz. Aber Chad Nouis hat Recht, dass wegen der Umleitung der linken Seite nichts sortiert wird. Jeder Befehl könnte auf der rechten Seite verwendet werden und das Ergebnis wäre das gleiche.

Die Ursache des Problems ist immer noch der Parser, aber die Art und Weise, wie der Parser das Kommando neu strukturiert, ist interessant.

%Vor%

Beachten Sie, wie die Umleitung vom Anfang bis zum Ende des Befehls verschoben wird, und das Dateihandle von 1 wird explizit hinzugefügt. Sie können sicherlich sehen, wo der zusätzliche Raum herkommt.

    
dbenham 08.06.2012, 14:36
quelle
0

Umleitungsoperatoren werden auf den Befehl angewendet, dem sie am nächsten sind - nicht auf die gesamte Zeile.

In Ihren drei Testfällen leiten Sie die Standardausgabe der Befehle echo und set in eine Datei um. Durch das Umleiten von stdout bleibt nichts übrig, um nach more oder sort zu pipen.

In Ihrem geschachtelten for-Schleife-Beispiel, denke ich, gibt es einige unnötige Klammern, die die Kopfschmerzen verursachen. Versuchen Sie es stattdessen:

%Vor%     
Chad Nouis 08.06.2012 15:23
quelle

Tags und Links