Question L'écriture de la sortie ECHO dans le fichier VBS ne fonctionne pas


J'écris un script de traitement par lots qui crée un script VB en faisant écho à chaque ligne et en dirigeant la sortie vers le fichier créé. Cela fonctionne pour la plupart, sauf pour deux lignes qui obtiennent des variables de ligne de commande et les utilisent comme variables VBS. Ceci est le code:

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

Cela devrait ressembler à ceci dans le script VB:

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

Mais ce qui se passe, c'est que le script Batch évoque simplement la ligne entière, y compris >> uninstallBeta.vbs. Une idée pourquoi cela se produit? J'ai des lignes similaires pour créer d'autres scripts VBS et Batch qui, je pense, fonctionnent très bien de cette façon. J'ai vérifié les fautes de frappe et n'en ai trouvé aucune. Cela fonctionne très bien dans l'invite de commande, mais pas dans un script Batch.


4
2017-10-21 18:02


origine


J'ai découvert une solution ça corrige ça, mais je veux quand même savoir pourquoi cela est arrivé. - A Child of God
Vous voudrez peut-être regarder stackoverflow.com/a/9074483/1012053, en particulier le MISE À JOUR 2014-04-27 section en bas, pour une méthode d'éviter complètement la création d'un fichier VBS séparé. Vous pouvez réellement exécuter VBS directement dans un script batch! - dbenham
@dbenham je l'ai vu hier avant que quelqu'un ait répondu. En envisagera d'essayer cela. - A Child of God


Réponses:


Il est utile de comprendre comment cmd.exe analyse les scripts de lot:
Partie 1 - Aperçu
Partie 2 - Détails de l'expansion en pourcentage

Je vais travailler sur le traitement de la première ligne défectueuse:

echo strHomeFolder = oShell.ExpandEnvironmentStrings^(^"^%USERPROFILE^%^"^) >> uninstallBeta.vbs

Le traitement de pourcentage en phase 1 se produit avant ^ traitement d'échappement dans la phase 2. L'analyseur recherche donc une variable d'environnement nommée USERPROFILE^, et ne parvient pas à le trouver. Alors que se développe en une chaîne vide, laissant:

echo strHomeFolder = oShell.ExpandEnvironmentStrings^(^"^^"^) >> uninstallBeta.vbs

Ensuite, les carets sont traités pour échapper aux caractères de la phase deux. L'important est le premier ^" est une citation échappée, donc les caractères après sont ne pas cité. Le suivant ^^ est un caret échappé. Après la première citation qui n'est pas échappée, tous les caractères sont cités. Je signale qu'avec Q ci-dessus chaque caractère cité:

                                                        QQQQQQQQQQQQQQQQQQQQQQQ
echo strHomeFolder = oShell.ExpandEnvironmentStrings("^"^) >> uninstallBeta.vbs

Il devrait être évident pourquoi le >> la redirection ne fonctionne pas - elle est citée pour fonctionner comme un littéral de chaîne à la place.

Vous avez tenté d'échapper à la % comme ^% pour empêcher l'expansion variable dans le lot. Cela ne fonctionne pas. La bonne chose est de doubler les pourcentages:

echo strHomeFolder = oShell.ExpandEnvironmentStrings("%%USERPROFILE%%") >> uninstallBeta.vbs

Si la ligne est dans un bloc entre parenthèses, vous devrez alors échapper à la ), mais le ( n'aurait jamais besoin d'être échappé

for .... do (
    ...
    echo strHomeFolder = oShell.ExpandEnvironmentStrings("%%USERPROFILE%%"^) >> uninstallBeta.vbs
    ...
)

Notez que les règles sont différentes de la ligne de commande. Il n'y a pas de mécanisme pour échapper vraiment à un % dans la ligne de commande, et la ligne de commande conserve %undefinedVar% texte si la variable n'est pas définie. Cependant, vous pouvez effectivement empêcher l'expansion de la variable en incluant un ou plusieurs ^ entre les pourcentages pour que la variable ne soit pas trouvée. Le caret disparaît alors dans la phase 2. Mais la première citation doit être échappée pour que le ^ disparaît. Et la dernière citation doit être échappée pour que la redirection soit active.

Cela fonctionne à partir de la ligne de commande (mais pas dans un script batch):

echo strHomeFolder = oShell.ExpandEnvironmentStrings(^"%USERPROFILE^%^") >> uninstallBeta.vbs

Le caret peut apparaître n'importe où entre les pourcentages. Tous les éléments suivants fonctionneraient tout aussi bien:

%USER^PROFILE%
%^USERPROFILE%
etc.

7
2017-10-21 19:36



@ Facebook - Je n'ai aucune idée de la situation à laquelle vous faites référence. Je devrais voir un exemple concret. Si vous déterminez le scénario exact, envoyez une nouvelle question, ici ou sur StackOverflow. - dbenham
Ici c'est l'homme .... superuser.com/questions/1261588/... - Pimp Juice IT


J'ai essayé ceci et ça fonctionne comme prévu aussi .....

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

Je suis aussi un débutant dans le script par lots, j'ai trouvé cela fonctionner en essayant. J'espère que quelqu'un explique comment cela fonctionne.


2
2017-10-21 19:49



Voir la réponse de dbenham pour savoir pourquoi cela fonctionne. - A Child of God