Forum: PC Hard- und Software Gültigkeitsbereich von Umgebungsvariablen im Kommandozeileninterpreter von Windows XP


von Guido C. (guidoanalog)


Lesenswert?

Hallo,

wenn ich in der Eingabeaufforderung von Windows XP zunächst die 
Umgebungsvariable "result" definiere
1
set result=12
und anschließend innerhalb der Eingabeaufforderung einen neuen 
Befehlsinterpreter starte, in dem ich die gleiche Umgebungsvariable wie 
folgt nochmals definiere
1
cmd /c "set result=815 & set result & echo %result%"
erhalte ich die Ausgabe
1
result=815
2
12

Sollte
1
echo %result%
nicht auch den Wert
1
815
liefern?

Irgendwie kann ich mir darauf keinen "Reim machen".

Mit freundlichen Grüßen
Guido

von Peter II (Gast)


Lesenswert?

Guido C. schrieb:
> nicht auch den Wert815

nein, weil das %result% schon ausgewertet wird bevor cmd gestartet wird, 
die neue CMD sieht also eigentlich:

cmd /c "set result=815 & set result & echo 12"

von Guido C. (guidoanalog)


Lesenswert?

Hallo,

Peter II schrieb:
> cmd /c "set result=815 & set result & echo 12"

Vielen Dank für den Hinweis. Das leuchtet mir ein.

Gibt es denn eine (einfache) Möglichkeit den mit "/c" gestarteten 
Befehlsinterpreter zu überreden den Inhalt der Umgebungsvariable 
"result" auszugeben?

Mit freundlichen Grüßen
Guido

von Peter II (Gast)


Lesenswert?

> Gibt es denn eine (einfache) Möglichkeit den mit "/c" gestarteten
> Befehlsinterpreter zu überreden den Inhalt der Umgebungsvariable
> "result" auszugeben?
ja:

set result=12
set varname=result
cmd /c "set result=815 & set result & echo %%varname%%"

von Peter II (Gast)


Lesenswert?

sorry zu früh gefreut. Geht scheinbar nicht.

von Guido C. (guidoanalog)


Lesenswert?

Hallo,

Peter II schrieb:
> sorry zu früh gefreut. Geht scheinbar nicht.

so etwas ähnliches wollte ich auch gerade schreiben ;-)
Meine Versuche in diese Richtung waren leider auch erfolglos.

Mit freundlichen Grüßen
Guido

von (prx) A. K. (prx)


Lesenswert?

1
cmd /c "set result=815 & set result & cmd /c echo %^result%"

von Guido C. (guidoanalog)


Lesenswert?

Hallo,

A. K. schrieb:
> cmd /c "echo off & set result=815 & set result & echo echo %^result% >tmp.cmd & 
tmp.cmd"

A. K. schrieb:
> cmd /c "echo off & set result=815 & set result & echo echo %^result% >tmp.cmd & 
tmp.cmd & del tmp.cmd"

A. K. schrieb:
> cmd /c "set result=815 & set result & cmd /c echo %^result%"

Vielen Dank. Eins muss man Dir lassen, Deine Antworten sind recht 
dynamisch.  Die letzte Antwort gefällt mit am besten, sie hat auch mein 
Problem gelöst.

Für alle die es interessiert:
Ich möchte innerhalb einer FAMOS-Sequenz überprüfen, ob eine Datei bzw. 
ein Verzeichnis existiert. Dies geht am einfachsten über einen Aufruf 
des Windows Befehlsinterpreters. Damit ich weiß, ob der "dir"-Befehl 
erfolgreich ausgeführt wurde gebe ich "errorlevel" zurück. 
Interessanterweise kann ich mir vor "errorlevel" den Befehl "cmd /c" 
sparen. Entscheidend ist jedoch das "%^" vor errorlevel.

1
Result = Execute("cmd.exe", "/c ~034dir c:\test.txt & exit %^errorlevel%~034", "", 2, -1)

Nochmals vielen Dank an alle die "mitgeknobelt" haben.

Mit freundlichen Grüßen
Guido

von (prx) A. K. (prx)


Lesenswert?

Du solltest schon die richtige Frage stellen. Das geht einfacher:
1
  if exist c:\test.txt exit 1 & exit 0
Ist ausserdem nebenwirkungsfrei, weil ohne Ausgabe.

von (prx) A. K. (prx)


Lesenswert?

Ich kenne dieses FAMOS nicht, aber eigentlich müsste bei deiner Zeile 
das Gleiche rauskommen wie bei
1
 ... Execute("cmd.exe", "/c ~034dir c:\test.txt~034", ...
denn der Exit-Status ist ohnehin der Errorlevel des letzten Kommandos.

von Guido C. (guidoanalog)


Lesenswert?

Hallo,

A. K. schrieb:
> Du solltest schon die richtige Frage stellen. Das geht einfacher:  if exist 
c:\test.txt exit 1 & exit 0
> Ist ausserdem nebenwirkungsfrei, weil ohne Ausgabe.

Das mit der richtigen Frage ist natürlich so eine Sache. Mir war Anfangs 
lediglich die Sache mit den Umgebungsvariablen nicht klar.

Du hast natürlich recht der Befehlt "if exist" ist hier sicher 
eleganter. Allerdings ist in dem Beispiel von Dir der Befehl "exit 0" 
wirkungslos. Dies lässt sich leicht überprüfen, wenn man "exit 0" z. B. 
durch "exit 5" ersetzt und nach einer Datei suchen lässt die nicht 
existiert. Ersetzt man in Deinem Beispiel "&" durch "else" und schließt 
"exit 1" in rund Klammern ein funktioniert es.
1
cmd.exe "/c if exist c:\test.txt (exit 1) else exit 5"

A. K. schrieb:
> Ich kenne dieses FAMOS nicht, aber eigentlich müsste bei deiner Zeile
> das Gleiche rauskommen wie bei ... Execute("cmd.exe", "/c ~034dir 
c:\test.txt~034", ...
> denn der Exit-Status ist ohnehin der Errorlevel des letzten Kommandos.

Damit hast Du vollkommen recht. Ich habe es gerade getestet. Ich wusste 
nicht, dass der %errorlevel% durchgereicht wird. Ich dacht bisher ich 
erhalte nur den %errorlevel% der mir angibt, ob der Befehlsinterpreter 
ordnungsgemäß beendet wurde.

Abschließend noch für alle FAMOS interessierten: Zum Überprüfen, ob eine 
Datei bzw. ein Pfad existiert reicht folglich der Befehl
1
Result = Execute("cmd.exe", "/c dir c:\test.txt", "", 2, -1)
oder
1
Result = Execute("cmd.exe", "/c if exist c:\test.txt exit 1", "", 2, -1)
wobei zu beachten ist, dass sich die o. g. Befehle bezüglich der 
Rückgabewerte unterschiedlich verhalten.

[Edit]
Bitte beachten: Sollen die o. g. Beispiele auch mit Dateinamen 
funktionieren, die Leerzeichen enthalten, muss man noch ein paar 
Anführungszeichen (~034) einfügen. Das Grundkonzept sollte mit den 
Beispielen jedoch klar werden.
[/Edit]

Mit freundlichen Grüßen
Guido

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.