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.