Warum nicht "set-P" - Arbeit nach einer Leitung?
C:\>type c:\output.txt
abcd
C:\>type c:\output.txt | set /p V1=
C:\>set
... A bunch of junk, NOT seeing "V1"
Was ist passiert? Nach alle Unterlagen für SET
ich habe gesehen, %V1% zugeordnet gewesen sein sollte den Wert "abcd" aus der oben genannten, nicht?
Bin ich auf Windows XP Pro, SP3, wenn es darauf ankommt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das Rohr scheint, zum erstellen einer neuen CMD-Instanz für die Durchführung der nächste Befehl, der den Erhalt der pipe-Daten. Also, wenn das Rohr geschlossen hat, dass CMD-Instanz beendet und die variable verloren.
Ich weiß nicht, was doco Sie haben gesehen für die
set
Befehl, aber die Ausgabe vonset /?
klar:(mein Kursivdruck). Ich denke
set /p
erhält seine Eingabe von der Konsole unabhängig davon, was Sie versuchen zu Rohr in die über standard-Eingabe. Warum er nicht warten, ich bin mir nicht sicher.echo xxx | set /p xx=
auch nicht die variable.Aber, wenn Sie wollen, um eine variable festzulegen, die aus einer einzigen Zeile der Datei, können Sie verwenden Sie einfach diese:
Die zweite ist die einfachste, aber es hilft nicht viel, wenn Sie wollen, besorgen Sie sich die Ausgabe eines beliebigen Befehls, aber Sie können auch haben, um es zu lenken, um eine Datei zuerst.
Die erste erlaubt Ihnen, beliebige Kommandos auszuführen ohne temporäre Dateien:
Es ist eine interessante snippet auf auf dieser Seite, die nahelegt, es hat zu tun mit Kontexten:
obwohl ich es ablehne Kommentar über die Richtigkeit dieser Schlussfolgerung. Ich weiß nicht, was Kontexte sind, in diesem Sinne, bin ich nur bringen, um Ihre Aufmerksamkeit auf Vollständigkeit.
set /p V1=<c:\output.txt
funktioniert einwandfrei. Es ist nur das Rohr Vielfalt, die scheint nicht zu funktionieren.Dies ist keine direkte Antwort auf die ursprüngliche Frage, die fragte
Why doesn't [..] work?
, aber diese Antwort kann nützlich sein für die Menschen suchen, um zu erreichen, was wäre die logische Folge so etwas wie dieses:Den normalen Abhilfe, zum Beispiel für den obigen code wäre:
die funktioniert perfekt, außer, dass es eine neue Datei erstellt, die behandelt werden, danach (auf der Oberseite der Tatsache, dass wir brauchen, um zusätzliche Schritte, um sicherzustellen, dass diese neue Datei nicht ein bestehendes zu überschreiben, die wir nicht erstellt haben oder nie dazu gedacht zu ersetzen).
Während es ist wahr es ist keine Möglichkeit um mit einem Datei-stream, um die Lücke auf beiden Seiten des Rohres
|
Betreiber so weit wie Umgebungsvariablen sind besorgt, dass Sie unter einer Windows NT-Umgebung, und zur Verfügung gestellt dem Volumen, das Skript ist auf das NTFS-Dateisystem, kann man so etwas wesentlich ansprechender als temporäre Dateien: Alternative DatenströmeLassen Sie uns springen rechts in ein Beispiel zur Veranschaulichung, wie man diese verwenden könnten:
Hier
%~nx0
steht und wird erweitert, um die mit dem Namen (Basis-Namen + extension) für unsere batch-Datei, eingeschlossen in Anführungszeichen, falls er Leerzeichen enthält.Als solche
".\%~nx0":temp
bezieht sich auf eine alternate data stream (ADS) unserer eigenen - Skript mit dem Namentemp
zum Beispielmyscript.cmd:temp
, die wir erstellen (oder überschreiben) mit dem Ausgang desecho
Befehl. Da ADS Verhalten sich auf die gleiche Weise wie der Standard-stream ist eine Datei, dieecho
undset
Befehle sehe keinen Unterschied.Ein komplettes Skript mit der Methode könnte wie folgt Aussehen:
Hier, am Ende des Skripts die Zeile
type nul> %__self%:%__adsname
, die erweitert werden könnte, um so etwas wietype nul> ".\myscript.cmd":test.dat
ist, wird verwendet, um die Inhalte zu löschen von den alternate data stream, die wir gerade verwendet. Obwohl diese legt die Größe des alternate data stream-zero, es tut nicht löschen (siehe Hinweise unten).Einige abschließende Bemerkungen:
Meisten Befehle nicht verstehen kann oder bei der Arbeit mit alternate data streams, wenn Sie als Quelldateien. Dies bedeutet, dass die folgenden nicht verwendet werden:
type
z.B.type myscript.cmd:data > myscript_data.txt
copy
z.B.copy myscript.cmd:data myscript_data.txt
move
z.B.move myscript.cmd:data myscript_data.txt
del
/erase
z.B.del myscript.cmd:data
ren
/rename
z.B.ren myscript.cmd:data myscript.cmd:data.txt
In der Tat, es ist wirklich nur Datei-Umleitung unterstützt alternate data streams mit einer Ausnahme (die ich mir denken kann): die
start
Befehl.:$DATA
) und Bearbeiten/ändern Sie den Inhalt einer Datei wirkt sich nur auf die Standard-Daten-stream. Noch haben wir ein paar Optionen, je nachdem, was wir zu erreichen versuchen:type myscript.cmd > myscript_clean.cmd
, nach dem die ursprüngliche Datei gelöscht werden kann.dir /a-d /r
. Sie können dann jedes beliebige Programm verwenden, um Zugriff auf die Namen (alternate) Datenstrom einer Datei, z.B.notepad.exe myscript.cmd:data
Ich hoffe, das hilft!