O usuário digita manualmente, em uma janela, os dados de entrada, que são armazenados em variáveis. Então o lote faz um "eco" das variáveis que contém os dados que o usuário digitou (first.bat):
set source=%HOMEDRIVE%\test\data.txt
mydialogbox=%HOMEDRIVE%\test\myprogram_dialogbox.exe
SetLocal EnableDelayedExpansion
:: dialog box
for /f "tokens=1-3 delims=" %%i in ('%mydialogbox% --forms --title="Dialog" --text="Set Data" --add-entry="USER" --add-entry="PASSWORD" --add-entry="DBNAME" --separator=","') do (
set line=%%i
echo(!line: =!> %source%
)
IF EXIST %source% (GOTO setdata) else (GOTO end)
:setdata
FOR /F "eol=; tokens=1-3 delims=," %%A IN (%source%) DO (
set dbuser=%%A
set dbpass=%%B
set dbname=%%C
)
echo your imput: %dbuser% %dbpass% %dbname%
por exemplo:
your input: mydb zuckerberg dadada
Então eu preciso substituir esses valores (destas variáveis: %dbuser%
%dbpass%
%dbname%
) em outro script (second.bat)
set dbname=foo
set dbuser=bar
set dbpass=blabla
saída esperada (a mudança não pode ser dinâmica, mas permanente):
set dbname=mydb
set dbuser=zuckerberg
set dbpass=dadada
como faço isso?
PS: No linux isso é fácil
sed -e "s:$dbuser:zuckerberg:g" second.bat
PS: Se o que estou perguntando não funcionar, existe uma maneira de usar a saída das %dbuser%
%dbpass%
%dbname%
variáveis de first.bat
dentrosecond.bat
obrigado
Atualizar:
- Estou usando o fart-it e funcionou:
first.bat
:
fart.exe second.bat "zuckerberg" "%dbuser%"
fart.exe second.bat "dadada" "%dbpass%"
fart.exe second.bat "mydb" "%dbname%"
Mas tenho que executar 3 vezes o mesmo comando para cada substituição. E gostaria de saber se existe outra solução (.bat, .cmd) que não dependa de programas externos
- Outra solução é colocar a saída do "echo" nas variáveis em
second.bat
:
first.bat
:
echo your imput: %dbuser% %dbpass% %dbname%
second.bat
:
FOR /F "tokens=*" %%g IN ('echo %dbuser%') do (SET myuser=%%g)
etc
mas isso não substitui permanentemente os valores das variáveis do segundo script (que é o que eu quero).
- Outra solução é esta (
first.bat
):
(for /f "tokens=1* delims=:" %%a in (%source%) do (
if "%%b"=="" (echo %%a) else (
echo %%a|find " id" >null&& echo %%a: ||echo %%a: %%b
)
))>second.bat
Mas não consegui ajustá-lo aos meus interesses, pois ele reescreve a saída (não pesquisa e substitui as strings)
- Outra solução é com replacer.bat :
call replacer.bat "second.bat" "zuckerberg" "%dbuser%"
Tem os mesmos problemas que peido-it. Eu tenho que executar um comando para cada substituição (isso não é muito otimizado para o meu código) e dependeria de um script externo
Você pode usar a
call
função para passar as variáveis.%source%
no seu código, farei referência comofile.txt
aqui.conteúdo do arquivo.txt :
really,big,rabbit
conteúdo do test1.bat :
conteúdo do test2.bat :
Agora, se você executar
test1.bat
em cmd, obterá como saída:test2.bat é onde você pode colocar as variáveis que precisam ser executadas como seu segundo lote para fazer algo com esses parâmetros.
Passar argumentos cmd de script em lote clássico ao executar o
second.bat
deve fazer isso sem problemas. O uso desse método elimina completamente a necessidade de alterar qualquer conteúdo desecond.bat
.Ele essencialmente torna
second.bat
dinâmico e usa os parâmetros de argumento passados como variáveis que contêm os valores de espaço reservado (por exemplo%~1
,%~2
, etc.) para os valores de argumento passados (por exemplo ,"flockingbird" "clockingmerge" "wishyword"
).Segundo.bat
Executando
Você pode escolher qualquer método que funcione melhor para executar ou chamar o
second.bat
script, seja usandocall
,start
, algo comosecond.bat "flockingbird"
ou qualquer outra maneira que funcione para passar o valor do argumento no tempo de execução desecond.bat
Outro exemplo
Lote
Executar
Resultado
Recursos de apoio
Parâmetros de linha de comando
Passar argumentos de linha de comando (parâmetros) para um arquivo de lote do Windows
Começar
Ligar
Você não pode compartilhar variáveis locais entre sessões CMD.
Você precisa usar um mecanismo global para torná-los acessíveis a partir de outra sessão, por exemplo, um arquivo comum, o registro ou as variáveis do sistema (consulte o comando
setx
).Aqui está um exemplo da lógica envolvida no tratamento de uma inicialização de primeira execução. Validação adicional de dados passados como argumentos pela entrada do usuário fortemente recomendada.