Batch: come inoltrare i dati alla nuova istanza CMD come argomenti


1

Sto cercando di chiamare un'altra istanza CMD e passarci i dati dall'istanza padre.

Sono consapevole del percorso generale di utilizzo delle variabili, ma in questo caso non sarebbe possibile in quanto l'endlocal e il bridging rappresenterebbero un inconveniente eccessivo (dovrebbero trasmettere decine di variabili). So anche che potrei usare file temporanei per trasferire facilmente tutti i dati che voglio, ma questo lascerebbe impronte indesiderate. EDIT: setx può anche essere usato con successo.

Sto cercando specificamente qualcosa sulla falsariga dell'uso comune di argomenti, come:

test.bat -setvar"variable"="value" -setvar...

In precedenza ho trovato un modo con i suoi limiti

Ho scoperto su un altro thread che posso aggiungere un comando alla fine di inizio cmd

start cmd /c call "test.bat" ^& PAUSE

Naturalmente possiamo invertire questo

start cmd /c call PAUSE ^& TIMEOUT 5 ^& PAUSE ^& test.bat

I comandi non possono avere "" e, sospetto, caratteri speciali. ciò presenta un problema quando si tenta di trasferire variabili complesse.

A proposito di personaggi speciali:

start cmd /c call (PAUSE) ^& (TIMEOUT 5) ^& (REM !"#¤%&/=?`´^*"-.,_:;\*~¨) ^& test.bat

Questo non funzionerà affatto. Potrei essere in grado di sfuggire all'interpretazione, ma nel caso di alcune variabili potrei non avere il lusso di conoscere abbastanza i valori per essere in grado di elaborarlo in qualsiasi cosa io possa gestire. - In realtà sembra che le parentesi non siano tollerate.

Una delle cose principali che devo fare è trasmettere i nomi dei volumi, il che è facilmente raggiungibile, ma questo non è abbastanza.

start cmd /c call echo \\?\Volume{6537febd-01bc-11d6-adb5-806e6f6e6963}\ ^& TIMEOUT 5 ^& PAUSE ^& test.bat

Questo potrebbe essere già trattato altrove e in tal caso il problema è che non trovo le parole chiave giuste o paralleli ai thread pertinenti.


1
E c'è un motivo per cui non puoi usare il setxcomando che crea una variabile globale in cui puoi memorizzare la tua variabile in modo da poterla leggere dall'altra routine?
LPChip

Buon punto, anche se ricordo che richiederebbe privilegi amministrativi (scrivendo a HKLM giusto?), Che CMD potrebbe non avere. Una possibile soluzione per un altro script, sì, come lo sono le opzioni che ho menzionato prima, ma non quello che sto cercando.
Alex Oja,

1
No, un utente può sempre scrivere su HK_CU che è dove setx "name" "variable"scriverà, quindi non è necessario eseguire cmd con privilegi di amministratore, a meno che non si specifichi / M, quindi scriva su HK_LM e quindi sono necessari i privilegi di amministratore. Ma per quello che vuoi, non è necessario. Per cancellare una variabile precedentemente assegnata, si setx "name" ""noti inoltre che le variabili setx non diventano operative nella sessione corrente, ma solo nelle sessioni successive. Utilizzare setper la sessione corrente.
LPChip

Chiaramente avevo frainteso la funzione di setx, da allora a ss64. Grazie per aver chiarito questo!
Alex Oja,

1
Questo significa che non hai più bisogno di aiuto? In tal caso, ti scriverò felicemente una breve risposta per accettare la domanda e far sapere a tutti che sei pronto. :)
LPChip

Risposte:


2

cmdUn'istanza figlio eredita tutte le variabili di ambiente da quella principale. Prova: abbiamo creato due script batch:

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: %%* = %*

cmdOutput dell'istanza padre :

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>

cmdOutput dell'istanza figlio da 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 . . .

Nota startsintassi del comando a destra con "title":

START "title" [/D path] [options] "command" [parameters]

Includi sempre un TITLE che può essere una stringa semplice come "My Script" o solo una coppia di virgolette vuote "". Secondo la documentazione Microsoft, il titolo è facoltativo, ma a seconda delle altre opzioni scelte si possono avere problemi se viene omesso.

Assicurarsi che il startcomando non contenga l' /Iopzione switch (da start /?):

 /I      The new environment will be the original environment passed
         to the cmd.exe and not the current environment.

Per eliminare un'altra eventualità delle modifiche all'ambiente figlio, includere il /Dpassaggio a cmdcome segue:

start "test1" cmd /D /C call "test.bat"

Secondo cmd /?:

/D      Disable execution of AutoRun commands from registry

1

È possibile utilizzare setxper impostare una variabile ambientale globale per Windows.

Per usare setxsemplicemente scrivere questo: setx "name" "variable"dove nome è un nome semplice e variabile è una variabile che si desidera impostare.

Controlla setx /?tutte le opzioni e i parametri nel caso in cui desideri approfondire un po 'le opzioni.

Tuttavia, setx memorizzerà le variabili direttamente nell'hive del registro dell'utente corrente. Ciò significa che non sono necessari privilegi di amministratore, ma anche che le variabili non sono direttamente disponibili nella sessione cmd corrente. Utilizzare il normale setse si desidera solo archiviare le variabili localmente.

Puoi anche memorizzare una variabile locale in una globale come mostrato nel seguente esempio:

@echo off
:: store "test" in variable "a"
set a=test

:: make this variable global
setx a %a%

Come puoi vedere nell'esempio sopra, il %a%riferimento alla variabile nell'ambito locale e setx lo rende disponibile pubblicamente

Per annullare l'impostazione di una variabile globale, chiamare questo comando: setx "name" ""ad esempio:setx a ""

Buono anche da capire: non è possibile modificare un'istanza di cmd usando setx in un'altra. Non appena avvii una finestra cmd, solo set può modificare le sue variabili all'interno e setx può memorizzarle all'esterno. (all'uscita come vuoi)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.