Ich möchte eine andere CMD-Instanz aufrufen und ihr Daten von der übergeordneten Instanz übergeben.
Ich kenne den allgemeinen Weg der Verwendung von Variablen, aber in diesem Fall wäre das nicht machbar, da Endlocal und Bridging zu umständlich wären (man müsste Dutzende von Variablen weiterleiten). Ich weiß auch, dass ich temporäre Dateien verwenden könnte, um alle gewünschten Daten problemlos zu portieren, aber das würde unerwünschte Spuren hinterlassen. EDIT: setx kann auch recht erfolgreich verwendet werden.
Ich schauespeziellfür etwas in der Art der allgemeinen Verwendung von Argumenten, wie:
test.bat -setvar"variable"="value" -setvar...
Ich habe zuvor einen Weg mit seinen Einschränkungen gefunden
Habe in einem anderen Thread herausgefunden, dass ich am Ende von „Start cmd“ einen Befehl hinzufügen kann
start cmd /c call "test.bat" ^& PAUSE
Natürlich können wir das umkehren
start cmd /c call PAUSE ^& TIMEOUT 5 ^& PAUSE ^& test.bat
Die Befehle dürfen keine "" und, wie ich vermute, auch keine Sonderzeichen enthalten. Dies stellt ein Problem dar, wenn versucht wird, komplexe Variablen zu portieren.
Apropos Sonderzeichen:
start cmd /c call (PAUSE) ^& (TIMEOUT 5) ^& (REM !"#¤%&/=?`´^*"-.,_:;\*~¨) ^& test.bat
Das wird überhaupt nicht funktionieren. Ich kann vielleicht der Interpretation entgehen, aber bei manchen Variablen habe ich vielleicht nicht den Luxus, genügend Werte zu kennen, um sie in irgendetwas verarbeiten zu können, das ich verarbeiten kann. -- Tatsächlich scheinen Klammern nicht toleriert zu werden.
Eine meiner wichtigsten Aufgaben besteht darin, Datenträgernamen weiterzugeben. Das ist zwar problemlos möglich, reicht aber nicht aus.
start cmd /c call echo \\?\Volume{6537febd-01bc-11d6-adb5-806e6f6e6963}\ ^& TIMEOUT 5 ^& PAUSE ^& test.bat
Möglicherweise wurde dies bereits an anderer Stelle behandelt. Wenn das der Fall ist, liegt das Problem darin, dass ich nicht die richtigen Schlüsselwörter oder Parallelen zu den relevanten Threads finde.
Antwort1
Eine untergeordnete cmd
Instanzerbtalle Umgebungsvariablen von der übergeordneten. Beweis: Lassen Sie uns zwei Batch-Skripte erstellen:
Test1.bat
@setlocal
@set _batch
@set "_batchParentName=%~nx0"
@set "_batchParentPath=%~dp0"
@set "_batchParentSpec=< LSS > GTR & amper | pipe"
start "%~n0" cmd /C call "test.bat" "%_batchParentSpec%" %* ^& pause
@set _batch
Test.bat
@setlocal
@set _batch
@echo %~n0: %%* = %*
Ausgabe der übergeordneten cmd
Instanz:
d:\bat>test1.bat first "1<2" third
Environment variable _batch not defined
d:\bat>start "test1" cmd /C call "test.bat" "< LSS > GTR & amper | pipe" first "1<2" third
& pause
_batchParentName=test1.bat
_batchParentPath=D:\bat\
_batchParentSpec=< LSS > GTR & amper | pipe
d:\bat>
cmd
Ausgabe der untergeordneten Instanz von test.bat
:
_batchParentName=test1.bat
_batchParentPath=D:\bat\
_batchParentSpec=< LSS > GTR & amper | pipe
test: %* = "< LSS > GTR & amper | pipe" first "1<2" third
Press any key to continue . . .
Hinweis rechtsstart
Befehlssyntaxmit "title"
:
START "title" [/D path] [options] "command" [parameters]
Geben Sie immer einen TITEL an. Dies kann eine einfache Zeichenfolge wie „Mein Skript“ oder nur ein Paar leerer Anführungszeichen „“ sein. Laut der Microsoft-Dokumentation ist der Titel optional, aber je nach den anderen gewählten Optionen kann es zu Problemen kommen, wenn er weggelassen wird.
Sicherstellender start
Befehlnichtenthalten den /I
Optionsschalter (von start /?
):
/I The new environment will be the original environment passed
to the cmd.exe and not the current environment.
Um eine weitere Möglichkeit auszuschließen, dass sich die untergeordnete Umgebung ändert, schließen Sie den /D
Schalter cmd
wie folgt ein:
start "test1" cmd /D /C call "test.bat"
Gemäß cmd /?
:
/D Disable execution of AutoRun commands from registry
Antwort2
Sie können damit setx
eine Umgebungsvariable festlegen, die global für Ihr Fenster gilt.
Zur Verwendung setx
schreiben Sie einfach Folgendes: setx "name" "variable"
wobei „Name“ ein einfacher Name und „Variable“ eine Variable ist, die Sie festlegen möchten.
Sehen Sie setx /?
sich alle Optionen und Parameter an, falls Sie etwas tiefer in die Optionen einsteigen möchten.
Beachten Sie jedoch, dass setx Variablen direkt im Hive der Registrierung des aktuellen Benutzers speichert. Dies bedeutet, dass Sie keine Administratorrechte benötigen, aber es bedeutet auch, dass die Variablen in der aktuellen Cmd-Sitzung nicht direkt verfügbar sind. Verwenden Sie die normale Option, set
wenn Sie Variablen nur lokal speichern möchten.
Sie können natürlich auch eine lokale Variable in der globalen speichern, wie im folgenden Beispiel gezeigt:
@echo off
:: store "test" in variable "a"
set a=test
:: make this variable global
setx a %a%
Wie Sie im obigen Beispiel sehen können, %a%
bezieht sich auf die Variable im lokalen Bereich, und setx macht sie öffentlich verfügbar
Um eine globale Variable aufzuheben, rufen Sie diesen Befehl auf. setx "name" ""
Beispiel:setx a ""
Auch gut zu wissen: Sie können eine Instanz von cmd nicht ändern, indem Sie setx in einer anderen verwenden. Sobald Sie ein cmd-Fenster öffnen, kann nur set seine Variablen darin ändern und setx kann sie außerhalb speichern. (beim Beenden, wie Sie wollen)