Escrever saída ECHO para o arquivo VBS não funciona

4

Estou escrevendo um script em lote que cria um script VB fazendo eco de cada linha e direcionando a saída para o arquivo criado. Ele funciona na maior parte, exceto por duas linhas que obtêm variáveis de linha de comando e as usam como variáveis VBS. Este é o código:

ECHO:strHomeFolder = oShell.ExpandEnvironmentStrings^(^"^%USERPROFILE^%^"^) >> uninstallBeta.vbs
ECHO:strProgramData = oShell.ExpandEnvironmentStrings^(^"^%ProgramData^%^"^) >> uninstallBeta.vbs

Deverá ter esta aparência no Script VB:

strHomeFolder = oShell.ExpandEnvironmentStrings("%USERPROFILE%")
strProgramData = oShell.ExpandEnvironmentStrings("%ProgramData%")

Mas o que acontece é que o Batch Script apenas ecoa a linha inteira, incluindo >> uninstallBeta.vbs . Alguma ideia de por que isso acontece? Eu tenho linhas semelhantes para criar outros scripts VBS e Batch que eu acho que funcionam muito bem fazendo assim. Eu verifiquei erros de digitação e não encontrei nenhum. Ele funciona muito bem no Prompt de Comando, mas não em um Script em Lote.

    
por A Child of God 21.10.2017 / 20:02

2 respostas

7

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.
    
por 21.10.2017 / 21:36
2

Eu tentei isso e funciona como esperado também .....

set a=userprofile
set b=ProgramData
> uninstallBeta.vbs ECHO strHomeFolder = oShell.ExpandEnvironmentStrings^("%%%a%%%%"^)
>> %DESKTOP%\uninstallBeta.vbs ECHO strProgramData = oShell.ExpandEnvironmentStrings^("%%%b%%%%"^)

Eu também sou um iniciante em scripts em lote e encontrei este trabalho tentando. espero que alguém explique como funciona.

    
por 21.10.2017 / 21:49