Variablenerweiterung im CMD-Fenster für OneLiner oder wie bekomme ich die Variable aufgelöst
Ausrufezeichen welche im CMD-Fenster über Einzeiler in Variablen gesetzt werden zeigten die Variable mittels gestarteter "CMD /von" ohne diese Ausrufezeichen dar.
Normal ist es nicht möglich Variablen in Einzeilern ohne Verzögerte Variablenerweiterung Anzuzeigen oder zu verändern.
Es gibt einen kleinen Umweg um Variablen in Einzeilern ohne DelayedExpansion darzustellen und zu erweitern.
Vorausetzung ist, dass die zu verwendende Variable vorher nicht Existiert.
oder für die Ersetzung von Worten in Textdateien
um die Erweiterung der Variablen zu nutzen, müssen diese in AnführungsZeichen gesetzt werden.
für die Ersetzung von ProzentZeichen, muss dieses in eine weitere ForVariable gesetzt werden.
Du kannst natürlich auch die ganze Ersetzungsform in eine ForVariable eintragen (was natürlich nur bei zu ersetzenden % nötig ist.
Dieser Umweg dauert aber sehr lange in der Befehlsausführung!
PS. Ich habe bewusst auf @ für die auschaltung der Anzeige des Befehles Verzichtet, da ich auf der CMD-Line mit ECHO OFF gearbeitet habe.
Gruß Phil
Normal ist es nicht möglich Variablen in Einzeilern ohne Verzögerte Variablenerweiterung Anzuzeigen oder zu verändern.
Es gibt einen kleinen Umweg um Variablen in Einzeilern ohne DelayedExpansion darzustellen und zu erweitern.
Vorausetzung ist, dass die zu verwendende Variable vorher nicht Existiert.
set "test=123"&for /f "tokens=*" %i in ('echo "%Test%"') do echo %~i
oder für die Ersetzung von Worten in Textdateien
(for /f "usebackq tokens=*" %i in ("D:\Textfile.txt") do set "Line=%i"&for /f "tokens=*" %j in ('echo "%Line:Wort1=anderes Wort%") do echo %~j)>"D:\neues Textfile.txt"
um die Erweiterung der Variablen zu nutzen, müssen diese in AnführungsZeichen gesetzt werden.
für die Ersetzung von ProzentZeichen, muss dieses in eine weitere ForVariable gesetzt werden.
for %i in ("%") do for %j in (*.*) do set "File=%j"&for /f "tokens=*" %k in ('echo "%File:%i=%"') do ren "%j" %k
Du kannst natürlich auch die ganze Ersetzungsform in eine ForVariable eintragen (was natürlich nur bei zu ersetzenden % nötig ist.
for /f "tokens=*" %i in ("~0,-4") do for /f "tokens=*" %j in ('Dir /b') do set "Datei=%~nj"& for /f "tokens=*" %k in ('echo "%Datei:%i%"') do echo %k%~xj
Dieser Umweg dauert aber sehr lange in der Befehlsausführung!
PS. Ich habe bewusst auf @ für die auschaltung der Anzeige des Befehles Verzichtet, da ich auf der CMD-Line mit ECHO OFF gearbeitet habe.
Gruß Phil
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 151349
Url: https://administrator.de/contentid/151349
Ausgedruckt am: 21.11.2024 um 17:11 Uhr
4 Kommentare
Neuester Kommentar
Das geht auch einfacher
oder wenn man mit DelayedExpansion arbeiten möchte
Dagegen klappt dieser Teil bei mir nicht
Ich kann mir eigentlich auch nicht vorstellen, dass das ohne DelayedExpansion klappen kann,
da man meiner Ansicht nach nicht in einem Prozentausdruck ein Prozent ersetzen kann.
jeb
set "test=123"& call echo "%Test%"
oder wenn man mit DelayedExpansion arbeiten möchte
cmd /Von /c "set test=123& echo !Test!"
Dagegen klappt dieser Teil bei mir nicht
Zitat von @pieh-ejdsch:
um die Erweiterung der Variablen zu nutzen, müssen diese in AnführungsZeichen gesetzt werden.
für die Ersetzung von ProzentZeichen, muss dieses in eine weitere ForVariable gesetzt werden.
um die Erweiterung der Variablen zu nutzen, müssen diese in AnführungsZeichen gesetzt werden.
für die Ersetzung von ProzentZeichen, muss dieses in eine weitere ForVariable gesetzt werden.
for %i in ("%") do for %j in (*.*) do set "File=%j"&for /f "tokens=*" %k
> in ('echo "%File:%i=%"') do ren "%j" %k
Ich kann mir eigentlich auch nicht vorstellen, dass das ohne DelayedExpansion klappen kann,
da man meiner Ansicht nach nicht in einem Prozentausdruck ein Prozent ersetzen kann.
jeb
Hi pieh-ejdsch,
also ich fürchte ich verstehe immer noch nicht so ganz was eigentlich dein Ziel ist.
Zum einen verstehe ich nicht wozu du eine for-loop verwendest um genau einen Wert in eine Variable zu setzen.
Warum verwendest du das Ausrufezeichen nicht einfach, statt %i?
Und natürlich kann man in einem Delayed-Ausdruck kein direktes Ausrufezeichen selbst ersetzten
Kann also beides nicht klappen (sind auch beide praktisch identisch)
Aber vielleicht blicke ich einfach nicht durch.
Vielleicht war dein Ziel eine Datei einzulesen und die Daten eins zu eins wieder ausgeben zu können ohne was aus versehen zu verändern oder zu verlieren, oder mal das ein oder andere Wort dabei zu ersetzen.
Falls es das ist, bietet sich folgendes an (In einem BatchFile, auf der Kommandozeile aber ähnlich)
Der Trick besteht darin, vor der Zuweisung von %i an Line das DelayedExpansion abzuschalten, das ist notwendig, weil sonst zerstört man dabei die Ausrufezeichen.
Für die Ausgabe und Bearbeitung sollte man aber gerade mit aktiver DelayedExpansion arbeiten, denn nur damit kann man die Daten kontrollieren.
Sonst muss man ständig mit unausgeglichenen Anführungszeichen, &,|,>,<,^ und % Zeichen kämpfen, die spielen aber in der Delayed-Phase alle keine Rolle mehr.
Falls dass aber doch nicht dein Anliegen war, versuch es mal so einfach zu erklären, damit ich es verstehen kann.
jeb
also ich fürchte ich verstehe immer noch nicht so ganz was eigentlich dein Ziel ist.
Zum einen verstehe ich nicht wozu du eine for-loop verwendest um genau einen Wert in eine Variable zu setzen.
for %i in (!) do ...
Und natürlich kann man in einem Delayed-Ausdruck kein direktes Ausrufezeichen selbst ersetzten
Kann also beides nicht klappen (sind auch beide praktisch identisch)
!File:!=!
oder
!File:%i=!
Aber vielleicht blicke ich einfach nicht durch.
Vielleicht war dein Ziel eine Datei einzulesen und die Daten eins zu eins wieder ausgeben zu können ohne was aus versehen zu verändern oder zu verlieren, oder mal das ein oder andere Wort dabei zu ersetzen.
Falls es das ist, bietet sich folgendes an (In einem BatchFile, auf der Kommandozeile aber ähnlich)
setlocal EnableDelayedExpansion
FOR /F "usebackq tokens=*" %%i IN ("D:\Textfile.txt") DO (
setlocal DisableDelayedExpansion
set Line=%%i
setlocal EnableDelayedExpansion
Echo unveränderte Ausgabe !Line!
set NewLine=!Line:Wort1=anderes Wort!
)
Der Trick besteht darin, vor der Zuweisung von %i an Line das DelayedExpansion abzuschalten, das ist notwendig, weil sonst zerstört man dabei die Ausrufezeichen.
Für die Ausgabe und Bearbeitung sollte man aber gerade mit aktiver DelayedExpansion arbeiten, denn nur damit kann man die Daten kontrollieren.
Sonst muss man ständig mit unausgeglichenen Anführungszeichen, &,|,>,<,^ und % Zeichen kämpfen, die spielen aber in der Delayed-Phase alle keine Rolle mehr.
Falls dass aber doch nicht dein Anliegen war, versuch es mal so einfach zu erklären, damit ich es verstehen kann.
jeb