2017-01-04 2 views
1

ich den Code unten habe:Senden Parameter mit Sonderzeichen in einer anderen Batch-Datei aus einer Batch-Datei

second.bat Datei

echo %~1 
echo %~2 

first.bat Datei

@ECHO OFF &SETLOCAL 
@SETLOCAL EnableExtensions EnableDelayedExpansion 

set /p User=Enter Username: 
set /p Password=Enter Password: 

call second.bat %User% %Password% 

Wenn Benutzer Eingaben Admin als Benutzername und Admin!23 als Passwort die Ausgabe in second.bat Echo erzeugt wird, ist wie folgt:

Admin 
Admin23 

Wie kann ich die Sonderzeichen als auch in der second.bat Datei wie unten bekommen?

Admin 
Admin!23 
+0

Ihre 'call'ed-Routine erbt sowohl die Variablen als auch den' expansion' -Status. In Ihrer zweiten Routine können Sie einfach 'set user' und' set password' setzen, um die tatsächlichen Werte zu sehen. Wenn Sie diese Werte in der zweiten Routine ändern, wird der geänderte Wert an die aufrufende Routine zurückgegeben. Da "delayedexpansion" wirksam ist, wird ein einfaches "echo" versuchen, sein Argument gemäß den normalen Regeln zu erweitern. Um das '!' Zu verwenden, müssen Sie 'delayedexpansion' ausschalten - entweder vor dem Aufruf der zweiten Routine oder innerhalb der zweiten Routine. – Magoo

Antwort

2

Es hängt von Ihren Möglichkeiten.
Darf die Datei second.bat geändert werden?

Dann sollten Sie die Werte durch (variable) Referenzen anstelle von Werten übertragen, da CALL nicht sehr gut mit komplexen Werten funktioniert.

Lösung 1:
Dann können Sie second.bat

ändern
@echo off 
echo !user!, !password! 

Lösung 2:
Wenn Sie nicht second.bat mehr ändern, und es erfordert das Passwort als Aufruf Parameter, könnten Sie ändern first.bat zu

Es funktioniert nur, wenn Zitate im Passwort verwendet werden, dann werden sie verdoppelt.

Lösung 3:
Injizieren Code ohne Änderung der Datei second.bat.

Unter der Annahme, second.bat sieht aus wie

@echo off 
setlocal EnableDelayedExpansion 
set "user=%~1" 
set "pwd=%~2" 

echo !pwd! 

ändern first.bat zu:

set ^"Inject=." & (set pwd=^!password^!) & rem #" 
call second.bat "%%User%%" %%Inject%% 

Dieses beliebiges Passwort umgehen kann, wie die Linie in second.bat set "pwd=%~2" wird geändert im laufenden Betrieb zu

set "pwd=." & (set pwd=!password!) & rem #" 
+0

Glücklicherweise kann ich second.bat so echo! User !,! Password bearbeiten! hat funktioniert. – Joshi

+0

Die Probleme treten auf, wenn das Passwort andere Sonderzeichen und Sonderzeichen enthält. Karrieren werden durch 'CALL' verdoppelt und die Zitate werden immer schlechter. – jeb

+0

Ich verstehe deine zweite Lösung nicht: Warum gibt es keinen 'Anruf' vor' second.bat'? und warum übergibt man die Literalstrings '% User%' und '% Password%' an 'second.bat'? – aschipfl

1

Sie brauchen DelayedExpansion zu diesem Zeitpunkt nicht! Wenn Sie es danach brauchen, aktivieren Sie es danach! Wenn Sie die letzte Zeile Ihres Beispiels wiederholen, sehen Sie, dass die ! ebenfalls fehlen sollte.

Da DelayedExpansion das Ausrufezeichen als spezielles Symbol verwendet, wird es gelöscht.

Verwandte Themen