Gültigkeitsbereich von Umgebungsvariablen im Kommandozeileninterpreter von Windows XP

OP #2752738
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
Gast #2752775
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%%"
OP #2752839
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
OP #2754303
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren