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 cmd
instancia 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>
cmd
Salida 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 derechastart
sintaxis 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 start
comandono escontiene el /I
interruptor 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 /D
cambio a cmd
lo siguiente:
start "test1" cmd /D /C call "test.bat"
Según cmd /?
:
/D Disable execution of AutoRun commands from registry
Respuesta2
Puede utilizarlo setx
para establecer una variable ambiental que sea global para sus ventanas.
Para usarlo, setx
simplemente 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 set
si 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)