Batch: como encaminhar dados para a nova instância CMD como argumentos

1

Estou tentando chamar outra instância CMD e passar dados para ela da instância pai.

Estou ciente da rota geral de usar variáveis, mas não seria viável neste caso, pois o endlocal e o bridging seria muito inconveniente (teria que retransmitir dezenas de variáveis). Eu também sei que eu poderia usar arquivos temporários para portar todos os dados que eu quero facilmente, mas isso deixaria pegadas indesejadas. EDIT: setx também pode ser usado com bastante sucesso.

Estou procurando especificamente para algo ao longo das linhas de uso comum de argumentos, como:

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

Eu encontrei anteriormente um caminho com suas limitações

Descobri em outro thread que eu posso adicionar um comando ao final do cmd iniciar

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 de caracteres especiais:

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

Isso não funcionará de jeito nenhum. Eu poderia ser capaz de escapar da interpretação, mas no caso de algumas variáveis eu poderia não ter o luxo de saber o suficiente dos valores para poder processá-lo em qualquer coisa que eu pudesse manipular.     - Na verdade, parênteses não são tolerados.

Uma das principais coisas que preciso fazer é passar os nomes dos volumes, o que é facilmente alcançável, mas isso não é suficiente.

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

Isso já pode estar coberto em outro lugar e, se for o caso, não estou encontrando as palavras-chave corretas ou paralelas aos tópicos relevantes.

    
por Alex Oja 31.05.2015 / 03:53

2 respostas

2

Uma criança cmd instance herda todas as variáveis de ambiente da variável pai. Prova: vamos criar dois scripts em lote:

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

Saída da instância parent 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>

Criança cmd instance output 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 . . .

Observe a sintaxe de comando start com "title" :

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

Always include a TITLE this can be a simple string like "My Script" or just a pair of empty quotes "". According to the Microsoft documentation, the title is optional, but depending on the other options chosen you can have problems if it is omitted.

Garanta que o comando start não contenha a opção /I (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 das alterações do ambiente filho, inclua a alteração /D em cmd da seguinte forma:

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

Como por cmd /? :

/D      Disable execution of AutoRun commands from registry
    
por 02.06.2015 / 13:12
1

Você pode usar setx para definir uma variável de ambiente que seja global para suas janelas.

Para usar setx , basta escrever isto: setx "name" "variable" , em que name é um nome simples, e variable é uma variável que você deseja definir.

Veja setx /? para todas as opções e parâmetros, caso queira aprofundar um pouco mais nas opções.

Observe, porém, que o setx armazenará variáveis diretamente na seção do registro do usuário atual. Isso significa que você não precisa de privilégios administrativos, mas também significa que as variáveis não estão diretamente disponíveis na sessão cmd atual. Use o set regular se você quiser apenas armazenar variáveis localmente.

Você também pode armazenar uma variável local na global como 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, o %a% refere-se à variável no escopo local e o setx faz com que ela fique disponível publicamente

Para cancelar a configuraçã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 de cmd usando setx em outra. Assim que você iniciar uma janela cmd, somente o conjunto pode alterar suas variáveis dentro, e o setx pode armazená-las fora. (quando sair, você vai)

    
por 31.05.2015 / 16:08