Lote: como encaminhar dados para uma nova instância do CMD como argumentos

Lote: como encaminhar dados para uma nova instância do CMD como argumentos

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 cmdinstâ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>

cmdSaí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 certastartsintaxe 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 startcomandonãocontém a /Iopçã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 /Dmudança para cmdo seguinte:

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

Conforme cmd /?:

/D      Disable execution of AutoRun commands from registry

Responder2

Você pode usar setxpara definir uma variável ambiental que seja global para suas janelas.

Para usar setxbasta 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 setse 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)

informação relacionada