Das Schreiben der ECHO-Ausgabe in die VBS-Datei funktioniert nicht

1262
A Child of God

Ich schreibe ein Batch-Skript, das ein VB-Skript erstellt, indem jede Zeile wiederholt wird und die Ausgabe an die erstellte Datei gerichtet wird. Es funktioniert größtenteils, mit Ausnahme von zwei Zeilen, die Befehlszeilenvariablen abrufen und als VBS-Variablen verwenden. Dies ist der Code:

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

Im VB-Skript sollte es so aussehen:

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

Aber was passiert, ist das Batch-Skript, es wird nur die gesamte Zeile, einschließlich >> uninstallBeta.vbs. Irgendeine Idee, warum das passiert? Ich habe ähnliche Zeilen für das Erstellen anderer VBS- und Batch-Skripts, die meiner Meinung nach gut funktionieren, wenn Sie es auf diese Weise tun. Ich habe nach Tippfehlern gesucht und keine gefunden. Es funktioniert gut in der Eingabeaufforderung, aber nicht in einem Batch-Skript.

4
Ich habe [eine Lösung] (https://ss64.com/nt/syntax-redirection.html) entdeckt, die das Problem behebt, aber ich möchte trotzdem wissen, warum dies passiert ist. A Child of God vor 6 Jahren 0
Unter https://stackoverflow.com/a/9074483/1012053, insbesondere im Abschnitt *** UPDATE 2014-04-27 *** unten, sollten Sie nach einer Methode suchen, mit der das Erstellen einer separaten VBS-Datei vollständig vermieden werden kann . Sie können VBS tatsächlich direkt in einem Batch-Skript ausführen! dbenham vor 6 Jahren 0
@dbenham Ich habe das gestern gesehen, bevor jemand geantwortet hat. Ich werde es in Betracht ziehen. A Child of God vor 6 Jahren 0

2 Antworten auf die Frage

7
dbenham

Es hilft zu verstehen, wie cmd.exe Batch-Skripts analysiert:
Teil 1 - Überblick
Teil 2 - Angaben zur prozentualen Erweiterung

Ich werde die Bearbeitung der ersten fehlerhaften Zeile durcharbeiten:

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

Die Prozentsatzverarbeitung in Phase 1 erfolgt vor der ^Escape-Verarbeitung in Phase 2. Der Parser sucht also nach einer Umgebungsvariablen mit dem Namen USERPROFILE^und kann diese nicht finden. Das erweitert sich also zu einer leeren Zeichenfolge und lässt:

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

Als nächstes werden die Einfügemarken verarbeitet, um Zeichen in Phase zwei zu umgehen. Das Wichtigste ist, dass es sich bei dem ersten ^"um ein Escape-Zitat handelt, sodass die nachfolgenden Zeichen nicht in Anführungszeichen gesetzt werden. Das nächste ^^ist ein flüchtiger Caret. Dann folgt das erste Zitat, das nicht mit einem Escape-Zeichen versehen wurde, daher werden alle nachfolgenden Zeichen in Anführungszeichen gesetzt. Ich bezeichne das mit Q über jedem zitierten Zeichen:

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

Es sollte offensichtlich sein, warum die >>Umleitung nicht funktioniert - sie wird in Anführungszeichen gesetzt und funktioniert stattdessen als String-Literal.

Sie haben versucht, die zu entkommen %als ^%variable Expansion innerhalb der Charge zu verhindern. Das funktioniert nicht. Das Richtige ist, die Prozente zu verdoppeln:

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

Wenn sich die Zeile innerhalb eines Klammerblocks befindet, müssen Sie den Escape-Befehl ), aber den Escape- (Code nie öffnen

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

Beachten Sie, dass sich die Regeln von der Befehlszeile unterscheiden. Es gibt keinen Mechanismus, um ein A %innerhalb der Befehlszeile wirklich zu umgehen, und die Befehlszeile behält den %undefinedVar%Text bei, wenn die Variable nicht definiert ist. Sie können die Erweiterung der Variablen jedoch effektiv verhindern, indem Sie einen oder mehrere ^Werte zwischen den Prozentwerten einfügen, sodass die Variable nicht gefunden wird. Das Caret verschwindet dann in Phase 2. Das erste Zitat muss jedoch entkommen werden, damit das interne ^verschwindet. Das letzte Zitat muss mit Escapezeichen versehen werden, damit die Umleitung aktiv ist.

Dies funktioniert von der Kommandozeile aus (aber nicht innerhalb eines Batch-Skripts):

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

Die Einfügemarke kann irgendwo zwischen den Prozenten erscheinen. All das Folgende würde genauso gut funktionieren:

%USER^PROFILE% %^USERPROFILE% etc. 
@Facebook - Ich habe keine Ahnung, auf welche Situation Sie sich beziehen. Ich müsste ein konkretes Beispiel sehen. Wenn Sie das genaue Problem herausfinden, veröffentlichen Sie eine neue Frage, entweder hier oder in StackOverflow. dbenham vor 6 Jahren 0
Hier ist der Mensch .... https://superuser.com/questions/1261588/batch-script-parenthesized-echo-of-the-word-where-issue Pimp Juice IT vor 6 Jahren 0
2
TahaEltahawy

Ich habe es ausprobiert und es funktioniert auch wie erwartet .....

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

Ich bin auch ein Anfänger im Batch-Scripting. Ich hoffe jemand erklärt, wie es funktioniert.

Sehen Sie die Antwort von Dbenham, warum das funktioniert. A Child of God vor 6 Jahren 0