Lote: cómo reenviar datos a una nueva instancia de CMD como argumentos

Lote: cómo reenviar datos a una nueva instancia de CMD como argumentos

Estoy buscando llamar a otra instancia CMD y pasarle datos desde la instancia principal.

Soy consciente de la ruta general de uso de variables, pero no sería factible en este caso ya que endlocal y bridging serían un gran inconveniente (tendría que transmitir decenas de variables). También sé que podría usar archivos temporales para transferir fácilmente todos los datos que quiero, pero esto dejaría huellas no deseadas. EDITAR: setx también se puede utilizar con bastante éxito.

Estoy buscandoespecíficamentepara algo parecido al uso común de argumentos, como:

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

Anteriormente encontré una forma con sus limitaciones.

En otro hilo descubrí que puedo agregar un comando al final del cmd de inicio.

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

Por supuesto que podemos revertir esto.

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

Los comandos no pueden tener "" y, sospecho, ningún carácter especial. esto presenta un problema al intentar portar variables complejas.

Hablando de personajes especiales:

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

Esto no funcionará en absoluto. Es posible que pueda escapar de la interpretación, pero en el caso de algunas variables es posible que no tenga el lujo de conocer los valores suficientes para poder procesarlos en cualquier cosa que pueda manejar. -- En realidad parece que no se toleran los paréntesis.

Una de las principales cosas que debo hacer es transmitir los nombres de los volúmenes, lo cual se puede lograr fácilmente, pero no es suficiente.

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

Es posible que esto ya esté cubierto en otro lugar y, de ser así, el problema es que no encuentro las palabras clave correctas o los paralelos con los hilos relevantes.

Respuesta1

Una cmdinstancia infantilheredatodas las variables de entorno de la principal. Prueba: creemos dos scripts por lotes:

Prueba1.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

prueba.bat

@setlocal
@set _batch
@echo %~n0: %%* = %*

Salida de la instancia principal cmd:

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>

cmdSalida de instancia secundaria de 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 derechastartsintaxis de comandocon "title":

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

Incluya siempre un TÍTULO, puede ser una cadena simple como "Mi script" o simplemente un par de comillas vacías "". Según la documentación de Microsoft, el título es opcional, pero dependiendo de las otras opciones elegidas puedes tener problemas si se omite.

AsegurarEl startcomandono escontiene el /Iinterruptor de opción (de start /?):

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

Para eliminar otra eventualidad de los cambios en el entorno secundario, incluya el /Dcambio a cmdlo siguiente:

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

Según cmd /?:

/D      Disable execution of AutoRun commands from registry

Respuesta2

Puede utilizarlo setxpara establecer una variable ambiental que sea global para sus ventanas.

Para usarlo, setxsimplemente escriba esto: setx "name" "variable"donde nombre es un nombre simple y variable es una variable que desea configurar.

Consulta setx /?todas las opciones y parámetros por si quieres profundizar un poco más en las opciones.

Sin embargo, tenga en cuenta que setx almacenará las variables directamente en el subárbol del registro del usuario actual. Esto significa que no necesita ningún privilegio administrativo, pero también significa que las variables no están disponibles directamente en la sesión cmd actual. Utilice el normal setsi solo desea almacenar variables localmente.

Por supuesto, también puede almacenar una variable local en la global como se muestra en el siguiente ejemplo:

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

:: make this variable global
setx a %a%

Como puede ver en el ejemplo anterior, se %a%refiere a la variable en el ámbito local y setx la hace disponible públicamente.

Para desarmar una variable global, llame a este comando: setx "name" ""por ejemplo:setx a ""

También es bueno saberlo: no puedes modificar una instancia de cmd usando setx en otra. Tan pronto como abre una ventana cmd, solo set puede cambiar sus variables internas y setx puede almacenarlas afuera. (al salir como quieras)

información relacionada