Isso ajuda a entender como o cmd.exe analisa os scripts em lote: Parte 1 - Visão geral - < a href="https://stackoverflow.com/a/7970912/1012053"> Parte 2 - Porcentagem de detalhes de expansão
Trabalharei no processamento da primeira linha defeituosa:
echo strHomeFolder = oShell.ExpandEnvironmentStrings^(^"^%USERPROFILE^%^"^) >> uninstallBeta.vbs
O processamento percentual na fase 1 acontece antes de ^
escapar do processamento na fase 2. Assim, o analisador procura uma variável de ambiente denominada USERPROFILE^
e não consegue encontrá-la. Então, isso se expande para uma string vazia, deixando:
echo strHomeFolder = oShell.ExpandEnvironmentStrings^(^"^^"^) >> uninstallBeta.vbs
Em seguida, os carets são processados para escapar dos caracteres na fase dois. O importante é que o primeiro ^"
é uma citação com escape, então os caracteres depois são não citados. O próximo ^^
é um cursor com escape. Do que segue a primeira cotação que não é escapada, então todos os caracteres depois são citados. Eu significo que com Q acima de cada caractere citado:
QQQQQQQQQQQQQQQQQQQQQQQ
echo strHomeFolder = oShell.ExpandEnvironmentStrings("^"^) >> uninstallBeta.vbs
Deve ser óbvio porque o redirecionamento >>
não está funcionando - ele é citado para funcionar como um literal de string.
Você tentou escapar de %
as ^%
para evitar a expansão de variáveis no lote. Isso não funciona. O correto é dobrar as porcentagens:
echo strHomeFolder = oShell.ExpandEnvironmentStrings("%%USERPROFILE%%") >> uninstallBeta.vbs
Se a linha estiver dentro de um bloco entre parênteses, você precisará escapar do )
, mas o (
nunca precisará ser ignorado
for .... do (
...
echo strHomeFolder = oShell.ExpandEnvironmentStrings("%%USERPROFILE%%"^) >> uninstallBeta.vbs
...
)
Observe que as regras são diferentes da linha de comando. Não há nenhum mecanismo para realmente escapar de um %
na linha de comando, e a linha de comando preserva %undefinedVar%
text se a variável for indefinida. No entanto, você pode efetivamente impedir a expansão da variável incluindo um ou mais ^
entre as porcentagens para que a variável não seja encontrada. O cursor, em seguida, desaparece na fase 2. Mas a primeira citação precisa ser escapada para que o ^
interno desapareça. E a última citação deve ser escapada para que o redirecionamento esteja ativo.
Isso funciona a partir da linha de comando (mas não dentro de um script em lotes):
echo strHomeFolder = oShell.ExpandEnvironmentStrings(^"%USERPROFILE^%^") >> uninstallBeta.vbs
O cursor pode aparecer em qualquer lugar entre as porcentagens. Todos os itens a seguir funcionariam da seguinte maneira:
%USER^PROFILE%
%^USERPROFILE%
etc.