Supondo que você tenha copiado o código corretamente - ele não faz nada de especial. O :"=""
literal é simplesmente anexado à sequência de argumentos expandida.
Se você tivesse %*:"=""%
(observe a porcentagem adicional), então expandiria uma variável de ambiente chamada *
, substituindo duas cotações por cada uma.
O recurso de expansão Localizar / Substituir está disponível apenas para expansão de variável, não expansão de argumento.
Eu estaria disposto a apostar que é um bug introduzido por alguém que tem muito pouca experiência com o idioma dos lotes.
Quase certamente há outro bug - Todos os espaços na tarefa são significativos. Portanto, está criando uma variável chamada "params "
(sem as aspas, observe o espaço à direita). Além disso, o valor terá um espaço principal. Tenho certeza que nenhum espaço é desejado.
Resposta atualizada e mais completa
Agora que conhecemos a fonte do código , é possível fornecer uma visão mais completa do que é indo. Mais contexto de código é necessário.
As linhas relevantes originais são:
set params = %*:"=""
echo UAC.ShellExecute "cmd.exe", "/c ""%~s0"" %params%", "", "runas", 1 >> "%temp%\getadmin.vbs"
O script em lote original exigia que ele fosse executado com privilégios de administrador elevados. O script pôde determinar se os privilégios de administrador estavam disponíveis e, se não, criava um script VBS temporário que, quando executado, criava uma nova sessão cmd.exe com privs de administrador e executava novamente o script em lote original com os mesmos argumentos originais. . O comando para executar novamente o script é incorporado em uma cadeia VBS e a cadeia pode incluir argumentos entre aspas. O VBS exige que os literais de aspas em uma string escapem dobrando-os.
A resposta original não preservou os argumentos e não tinha nenhuma variável params
. Um ano depois, o OP tentou estender a resposta para apoiar a preservação dos argumentos de chamada. Infelizmente, o código modificado nunca foi devidamente testado, e o "aprimoramento" foi seriamente bugado. Se você observar os muitos comentários para essa resposta, poderá ver muitos relatórios informando que a preservação do argumento ainda não estava funcionando.
Primeiro, o código define uma variável chamada "params" (com espaço à direita) e, em seguida, tenta usar uma variável indefinida chamada "params" (sem espaço à direita). Isso obviamente não pode funcionar. Mas simplesmente remover os espaços da definição não resolve nada.
set params=%*:"=""
O OP deve ter pensado que a sintaxe iria se expandir para a string de argumento original, com todas as citações duplicadas. Mas encontrar / substituir só funciona ao expandir variáveis, não argumentos.
Suponha que o script em lote original seja c:\test\test.bat
e seja chamado usando
test arg1 "arg 2" "arg 3"
A linha "corrigida" set params=%*:"=""
simplesmente obtém uma cópia dos argumentos com %*
e, em seguida, anexa a sequência :"=""
. Então, quando completa, a variável é definida da seguinte forma:
params=arg1 "arg 2" "arg 3":"=""
Mas o OP realmente queria:
params=arg1 ""arg 2"" ""arg 3""
A próxima linha usada para executar novamente o script com privilégios de administrador falharia. Expandir-se-ia para:
echo UAC.ShellExecute "cmd.exe", "/c ""c:\test\test.bat"" arg1 "arg 2" "arg 3":"=""", "", "runas", 1 >> "someTempPath\getadmin.vbs"
Aqui está o código como deveria ter sido escrito:
EDIT 2018-9-23: adicionou espaço à atribuição de parâmetros para se certificar de que é sempre definido, mesmo que não haja argumentos
set params= %*
echo UAC.ShellExecute "cmd.exe", "/c ""%~s0"" %params:"=""%", "", "runas", 1 >> "%temp%\getadmin.vbs"
A primeira linha simplesmente define params como
params= arg1 "arg 2" "arg 3"
A próxima linha usa a sintaxe :"=""
para duplicar todas as citações enquanto expande a variável params
:
echo UAC.ShellExecute "cmd.exe", "/c ""c:\test\test.bat"" arg1 ""arg 2"" ""arg 3""", "", "runas", 1 >> "someTempPath\getadmin.vbs"
Os argumentos originais são preservados e todas as citações foram duplicadas corretamente.
Eu tenho editei a resposta original para incorporar as correções de bugs.