-heny-
Goto Top

Eingabe in Datei umleiten lassen (Umweg über Prozedur)

Hallo,

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.

Content-Key: 85239

Url: https://administrator.de/contentid/85239

Printed on: April 23, 2024 at 17:04 o'clock

Member: gemini
gemini Apr 10, 2008 at 17:02:26 (UTC)
Goto Top
Hallo -heny-,

versuch's mal damit
@echo off
set /p "TestVariable=Geben Sie einen Wert ein: "  
call :TestProzedur %TestVariable%
goto :eof

:TestProzedur
echo %* >> test.txt
goto :eof
pause
Hat bei mir keine Fehler erzeugt.

Gruß,
gemini
Member: bastla
bastla Apr 10, 2008 at 17:08:22 (UTC)
Goto Top
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
2>> test.txt
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:
(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
[/Edit]
Member: bastla
bastla Apr 10, 2008 at 17:16:03 (UTC)
Goto Top
@gemini
Wenn das an das Ende der Zeile geschriebene Leerzeichen nicht stört, ist das die bessere Lösung.

Grüße
bastla
Member: Biber
Biber Apr 10, 2008 at 18:29:16 (UTC)
Goto Top
...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...
echo 1
1
Ein Eins explizieht unleiten auf den Monitor oder eine Datei...[works as designed]
echo 1>con
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
Member: -heny-
-heny- Apr 10, 2008 at 18:52:03 (UTC)
Goto Top
Hallo,

danke. Die von euch beschriebenen Lösungen funktionieren beide. Welche ist denn die "bessere" bzw. die, welche man benutzen sollte?

Und von STDERR, STDOUT usw. habe ich absolut keinen Plan, bzw. von Umleitungen allgemein. Ich wusste bis jetzt halt nur, dass ich mit ">" & ">>" bzw. "<" & "<<" eine Ausgabe in eine Textdatei umleiten kann.

Gibt es zu dem gesamten Thema ein Tutorial o.ä.?

Gruß,
heny

[Edit]
Noch etwas, würdet ihr bei einer gewünschten Ausgabeumleitung in eine Textdatei immer z.B. die Klammerung verwenden?
Bsp.: (echo.)>> datei.txt
[/Edit]
Member: bastla
bastla Apr 10, 2008 at 19:42:17 (UTC)
Goto Top
Hallo -heny-!

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
Im von Dir angesprochenen Fall würde ich weder Klammern, noch den Punkt (damit gibt's neuerdings Probleme) verwenden, sondern einfach
echo\>>datei.txt
schreiben.

Grüße
bastla
Member: Biber
Biber Apr 10, 2008 at 20:04:06 (UTC)
Goto Top
Moin -heny-,

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