/ / Enviando parâmetros com caracteres especiais para outro arquivo de lote a partir de um arquivo de lote - janelas, arquivo em lote, cmd, parâmetros, caracteres especiais

Envio de parâmetros com caracteres especiais para outro arquivo de lote a partir de um arquivo de lote - janelas, arquivo em lote, cmd, parâmetros, caracteres especiais

Eu tenho o código abaixo:

second.bat Arquivo

echo %~1
echo %~2

first.bat Arquivo

@ECHO OFF &SETLOCAL
@SETLOCAL EnableExtensions EnableDelayedExpansion

set /p User=Enter Username:
set /p Password=Enter Password:

call second.bat %User% %Password%

Se entradas do usuário Admin como nome de usuário e Admin!23 como senha a saída produzida em second.bat O eco é como abaixo:

Admin
Admin23

Como posso obter os caracteres especiais também no second.bat arquivo como abaixo?

Admin
Admin!23

Respostas:

2 para resposta № 1

Depende das suas possibilidades.
Você tem permissão para mudar o second.bat Arquivo?

Então você deve transferir os valores por referências (variáveis) em vez de valores, como CALL não funciona muito bem com valores complexos.

Solução 1:
Então você pode mudar o second.bat para

@echo off
echo !user!, !password!

Solução 2:
Se você não tem permissão para alterar second.bat e requer a senha como um parâmetro de chamada, você pode alterar first.bat para

@ECHO OFF
setlocal EnableExtensions EnableDelayedExpansion

set /p User=Enter Username:
set /p Password=Enter Password:

set ^"password=!password:"=""!"
setlocal DisableDelayedExpansion
call second.bat "%%User%%" "%%Password%%"
exit /b

Só falha quando as citações na senha são usadas, então elas são duplicadas.

Solução 3:
Injetando código para second.bat sem modificar o arquivo.

Assumindo second.bat parece

@echo off
setlocal EnableDelayedExpansion
set "user=%~1"
set "pwd=%~2"

echo !pwd!

Altere first.bat para:

set ^"Inject=." & (set pwd=^!password^!) & rem #"
call second.bat "%%User%%" %%Inject%%

Isso pode manipular qualquer senha, como a linha em second.bat set "pwd=%~2" será modificado na mosca para

set "pwd=." & (set pwd=!password!) & rem #"

1 para resposta № 2

Você não precisa de DelayedExpansion até esse ponto! Se você precisar depois, ative depois! Se você repetir a última linha do seu exemplo, verá que o ! deveria estar faltando também.

Como DelayedExpansion usa o ponto de exclamação como símbolo especial, ele é excluído.