Estou tentando chamar outra instância do CMD e passar dados da instância pai para ela.
Estou ciente da rota geral de uso de variáveis, mas não seria viável neste caso, pois endlocal e bridging seriam muito inconvenientes (teria que retransmitir dezenas de variáveis). Também sei que poderia usar arquivos temporários para portar facilmente todos os dados que desejo, mas isso deixaria pegadas indesejadas. EDIT: setx também pode ser usado com bastante sucesso.
Estou olhandoespecificamentepara algo parecido com o uso comum de argumentos, como:
test.bat -setvar"variable"="value" -setvar...
Eu encontrei anteriormente uma maneira com suas limitações
Descobri em outro tópico que posso adicionar um comando ao final do start cmd
start cmd /c call "test.bat" ^& PAUSE
Claro que podemos reverter isso
start cmd /c call PAUSE ^& TIMEOUT 5 ^& PAUSE ^& test.bat
Os comandos não podem ter "" e, suspeito, quaisquer caracteres especiais. isso apresenta um problema ao tentar portar variáveis complexas.
Falando em caracteres especiais:
start cmd /c call (PAUSE) ^& (TIMEOUT 5) ^& (REM !"#¤%&/=?`´^*"-.,_:;\*~¨) ^& test.bat
Isso não funcionará de jeito nenhum. Posso conseguir escapar da interpretação, mas no caso de algumas variáveis posso não ter o luxo de saber o suficiente dos valores para poder processá-los em qualquer coisa que eu possa manipular. - Na verdade, parece que os parênteses não são tolerados.
Uma das principais coisas que preciso fazer é passar nomes de volumes, o que é facilmente alcançável, mas não é suficiente.
start cmd /c call echo \\?\Volume{6537febd-01bc-11d6-adb5-806e6f6e6963}\ ^& TIMEOUT 5 ^& PAUSE ^& test.bat
Isso pode já ter sido abordado em outro lugar e, nesse caso, o problema é que não encontro as palavras-chave corretas ou paralelos com os tópicos relevantes.
Responder1
Uma cmd
instância filhaherdatodas as variáveis de ambiente da variável pai. Prova: vamos criar dois scripts em lote:
Teste1.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
Teste.bat
@setlocal
@set _batch
@echo %~n0: %%* = %*
Saída da instância pai 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
Saída da instância filha 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 certastart
sintaxe de comandocom "title"
:
START "title" [/D path] [options] "command" [parameters]
Sempre inclua um TITLE, que pode ser uma string simples como "Meu Script" ou apenas um par de aspas vazias "". Segundo a documentação da Microsoft, o título é opcional, mas dependendo das outras opções escolhidas você pode ter problemas se for omitido.
Garantiro start
comandonãocontém a /I
opção switch (de start /?
):
/I The new environment will be the original environment passed
to the cmd.exe and not the current environment.
Para eliminar outra eventualidade de alterações no ambiente filho, inclua a /D
mudança para cmd
o seguinte:
start "test1" cmd /D /C call "test.bat"
Conforme cmd /?
:
/D Disable execution of AutoRun commands from registry
Responder2
Você pode usar setx
para definir uma variável ambiental que seja global para suas janelas.
Para usar setx
basta escrever isto: setx "name" "variable"
onde nome é um nome simples e variável é uma variável que você deseja definir.
Veja setx /?
todas as opções e parâmetros caso queira se aprofundar um pouco mais nas opções.
Observe, porém, que setx armazenará variáveis diretamente no hive do registro do usuário atual. Isso significa que você não precisa de nenhum privilégio administrativo, mas também significa que as variáveis não estão disponíveis diretamente na sessão cmd atual. Use o regular set
se quiser apenas armazenar variáveis localmente.
É claro que você também pode armazenar uma variável local na global, conforme mostrado no exemplo a seguir:
@echo off
:: store "test" in variable "a"
set a=test
:: make this variable global
setx a %a%
Como você pode ver no exemplo acima, %a%
refere-se à variável no escopo local e setx a torna disponível publicamente
Para cancelar a definição de uma variável global, chame este comando: setx "name" ""
por exemplo:setx a ""
Também é bom perceber: você não pode modificar uma instância do cmd usando setx em outra. Assim que você abre uma janela cmd, apenas set pode alterar suas variáveis dentro, e setx pode armazená-las fora. (ao sair, como você quiser)