Batch: So leiten Sie Daten als Argumente an eine neue CMD-Instanz weiter

Batch: So leiten Sie Daten als Argumente an eine neue CMD-Instanz weiter

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 cmdInstanzerbtalle 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 cmdInstanz:

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>

cmdAusgabe 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 rechtsstartBefehlssyntaxmit "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 startBefehlnichtenthalten den /IOptionsschalter (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 /DSchalter cmdwie 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 setxeine Umgebungsvariable festlegen, die global für Ihr Fenster gilt.

Zur Verwendung setxschreiben 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, setwenn 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)

verwandte Informationen