Gültigkeitsbereich von Umgebungsvariablen im Kommandozeileninterpreter von Windows XP

OP #2752738
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
> 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
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
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.
OP
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

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.