O que faz a última parte do conjunto params =% *: “=” "do?

3

Estou trabalhando com um script em lote que precisa de direitos de administrador e tomei emprestado alguns códigos get-admin-rights da rede. Estou tentando descobrir o que a última parte de uma determinada linha faz:

set params = %*:"=""

Eu sei que a primeira parte cria uma variável e, em seguida, recupera todo o conjunto de parâmetros passados para o script;

set params = %*

Mas o que é que isso faz ?

:"=""
    
por David Mancini 12.09.2017 / 18:25

1 resposta

5

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.

    
por 13.09.2017 / 05:06

Tags