Eingabe in Datei umleiten lassen (Umweg über Prozedur)
Hallo,
folgender Codeschnipsel sei gegeben:
Prinzipiell soll das Skript eine Eingabe in eine Textdatei umleiten. Das funktioniert auch soweit problemlos. Probleme treten nur auf, wenn die Eingabe alphanumerisch und nur einstellig ist, z.B. "1" oder "a" oder "!". Andere, längere Eingaben wie "11" oder "1test" funktionieren perfekt.
Wenn die Eingabe nun nur aus einem alphanumerischen Zeichen besteht, wird folgender Inhalt in die Textdatei geschrieben:
Das kann ja nur daher kommen, dass die Variable nicht existiert. Die Frage ist jetzt nur, warum dieses Problem auftritt. Dass ich eine Abfrage nach der Länge und dem jeweiligen Wert machen kann, ist mir klar, aber ich würde gerne die Problematik an sich begreifen.
Gruß,
heny
PS: Die Lösung via Prozeduraufruf (Sprungmarke) ist gewollt und soll in jedem Fall bestehen bleiben. Sie scheint mit dem fehlerhaften Verhalten auch nichts zu tun zu haben, soweit ich das getestet habe.
folgender Codeschnipsel sei gegeben:
@echo off
set /p "TestVariable=Geben Sie einen Wert ein: "
call :TestProzedur %TestVariable%
goto :eof
:TestProzedur
echo %*>> test.txt
goto :eof
pause
Prinzipiell soll das Skript eine Eingabe in eine Textdatei umleiten. Das funktioniert auch soweit problemlos. Probleme treten nur auf, wenn die Eingabe alphanumerisch und nur einstellig ist, z.B. "1" oder "a" oder "!". Andere, längere Eingaben wie "11" oder "1test" funktionieren perfekt.
Wenn die Eingabe nun nur aus einem alphanumerischen Zeichen besteht, wird folgender Inhalt in die Textdatei geschrieben:
ECHO ist ausgeschaltet (OFF).
Das kann ja nur daher kommen, dass die Variable nicht existiert. Die Frage ist jetzt nur, warum dieses Problem auftritt. Dass ich eine Abfrage nach der Länge und dem jeweiligen Wert machen kann, ist mir klar, aber ich würde gerne die Problematik an sich begreifen.
Gruß,
heny
PS: Die Lösung via Prozeduraufruf (Sprungmarke) ist gewollt und soll in jedem Fall bestehen bleiben. Sie scheint mit dem fehlerhaften Verhalten auch nichts zu tun zu haben, soweit ich das getestet habe.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 85239
Url: https://administrator.de/contentid/85239
Ausgedruckt am: 22.11.2024 um 22:11 Uhr
7 Kommentare
Neuester Kommentar
Hallo -heny-!
Für einen einzelnen Buchstaben kann ich das Problem nicht nachvollziehen ...
Dass es mit "!" nicht klappt, müsste an einer "DelayedExpansion" liegen, und einstellige Zahlen werden als Kanalangaben interpretiert (eine resultierende Ausgabe zB der Art
schreibt natürlich keinen Inhalt in die Datei, da ja kein Fehler aufgetreten ist und daher keine Meldung über STDERROR kommt). Lösung dafür:
Grüße
bastla
[Edit] Nachtrag: Um Dich auch gegen die unerfreuliche Ausgabe von "ECHO ist ausgeschaltet (OFF)." ein wenig abzusichern (ergibt dann eine Leerzeile):
[/Edit]
Für einen einzelnen Buchstaben kann ich das Problem nicht nachvollziehen ...
Dass es mit "!" nicht klappt, müsste an einer "DelayedExpansion" liegen, und einstellige Zahlen werden als Kanalangaben interpretiert (eine resultierende Ausgabe zB der Art
2>> test.txt
(echo %*)>>test.txt
Grüße
bastla
[Edit] Nachtrag: Um Dich auch gegen die unerfreuliche Ausgabe von "ECHO ist ausgeschaltet (OFF)." ein wenig abzusichern (ergibt dann eine Leerzeile):
(echo\%*)>>test.txt
@gemini
Wenn das an das Ende der Zeile geschriebene Leerzeichen nicht stört, ist das die bessere Lösung.
Grüße
bastla
Wenn das an das Ende der Zeile geschriebene Leerzeichen nicht stört, ist das die bessere Lösung.
Grüße
bastla
...und noch der allerletzte i-Tüpfelchen:
Wie Du leicht nachvollziehen kannst am CMD-Prompt, haben die Ziffern bei Umleitungen auch spezielle Bedeutung.
Eine 1 ausgeben...
So klappt auf dieser Eventualfall mit "echo (1,2,3,4)>irgendeinDevice":
Du kannst also auch schreiben:
Grüße
Biber
Wie Du leicht nachvollziehen kannst am CMD-Prompt, haben die Ziffern bei Umleitungen auch spezielle Bedeutung.
Eine 1 ausgeben...
echo 1
1
Ein Eins explizieht unleiten auf den Monitor oder eine Datei...[works as designed]1
echo 1>con
ECHO ist eingeschaltet (ON).
ECHO ist eingeschaltet (ON).
So klappt auf dieser Eventualfall mit "echo (1,2,3,4)>irgendeinDevice":
>>con echo 1
1
Du kannst also auch schreiben:
...
:TestProzedur
>>test.txt echo\%*
goto :eof
Grüße
Biber
Hallo -heny-!
STDOUT = Standardausgabekanal (Kanal 1) -> Bildschirm (Konsole) = Gerät CON
STDERR = Ausgabekanal für Fehlermeldungen (Kanal 2) -> ebenfalls Bildschirm
Zu Deiner letzten Frage: Klammern sind vor allem dann sinnvoll, wenn Du mehrere Ausgaben hintereinander tätigst, zB
Im von Dir angesprochenen Fall würde ich weder Klammern, noch den Punkt (damit gibt's neuerdings Probleme) verwenden, sondern einfach
schreiben.
Grüße
bastla
STDOUT = Standardausgabekanal (Kanal 1) -> Bildschirm (Konsole) = Gerät CON
STDERR = Ausgabekanal für Fehlermeldungen (Kanal 2) -> ebenfalls Bildschirm
... eine Ausgabe in eine Textdatei umleiten kann.
... oder auch zB nach NUL, um sie im "Nichts" verschwinden zu lassen.Zu Deiner letzten Frage: Klammern sind vor allem dann sinnvoll, wenn Du mehrere Ausgaben hintereinander tätigst, zB
(
echo Ueberschrift
echo ============
echo\
iecho\
)>Liste.txt
echo\>>datei.txt
Grüße
bastla
Moin -heny-,
Hmmmjein...eher nein.
Es macht den Code nicht lesbarer (falls man/frau doch mal mehr als Zeile schreibt).
Sinnvoll ist die Echo-Klammerung bei solchen Dirty-Onelinern (auch vom CMD-Prompt), in denen mehr als ein Befehl pro Zeile auftaucht.
Beispiel:
Für jemanden, der den Code warten muss und auch für die CMD.exe selbst ist dieses eindeutiger:
Grüße
Biber
würdet ihr bei einer gewünschten Ausgabeumleitung in eine Textdatei immer z.B. die Klammerung verwenden
Hmmmjein...eher nein.
Es macht den Code nicht lesbarer (falls man/frau doch mal mehr als Zeile schreibt).
Sinnvoll ist die Echo-Klammerung bei solchen Dirty-Onelinern (auch vom CMD-Prompt), in denen mehr als ein Befehl pro Zeile auftaucht.
Beispiel:
echo Fehler & goto :eof
Für jemanden, der den Code warten muss und auch für die CMD.exe selbst ist dieses eindeutiger:
(echo Fehler) & goto :eof
Grüße
Biber