huberde
Goto Top

Übergabe von Parameter an eine Batch Funktion inklusive obere Anführungszeichen

Hallo zusammen,

ich habe mir einen Batchrumpf gebastelt, mit dem ich ein einfaches Logging der darin gemachten Dinge erzielen möchte:

SET filename=%~n0
SET logfile=C:\%filename%.log

CALL:printLogLine "Starting installation of %filename%.bat"
CALL:printCmdOutput "if exist "\Documents and Settings\All Users\Desktop\Quicktime Player.lnk" del "\Documents and Settings\All Users\Desktop\Quicktime Player.lnk"

goto:eof

REM Echo the date/time stamp including a logline to a file
:printLogLine
ECHO %date%^|%TIME:~0,8%^|%filename%.bat, %~1 >> %logfile%
goto:eof

REM Echo the date/time stamp and execute the given command printing both into a logfile
:printCmdOutput
ECHO %date%^|%TIME:~0,8%^|%filename%.bat: >> %logfile%
%~1 %~2 %~3 %~4 %~5 %~6 %~7 %~8 %~9 >> %logfile% 2>&1
goto:eof

Damit würden auch die Ausgaben des DEL Aufrufs mit einem Zeitstempel in der Logfile landen. Nun habe ich jedoch das Problem, dass ich nicht weiß wie ich " maskieren kann.
Wenn ich die Zeile in Form von

CALL:printCmdOutput "if exist \Documents and Settings\All Users\Desktop\Quicktime Player.lnk del \Documents and Settings\All Users\Desktop\Quicktime Player.lnk

schreibe, werden die äußeren Anführungszeichen bei der Übergabe an die Funktion geschluckt. So etwas

CALL:printCmdOutput "if exist """\Documents and Settings\All Users\Desktop\Quicktime Player.lnk""" del """\Documents and Settings\All Users\Desktop\Quicktime Player.lnk"

funktionier jedoch auch nicht. Und auch mit ^ maskieren scheint nicht zu klappen. Mein Beispiel funktioniert auch nur, weil den String eben in 9 Argumente aufteilt und die " zwischendrin
als Text gesehen werden. Das ist aber so nicht schön und auch nicht wirklich nachvollziehbar. Ich bin echt am Verzweifeln. Habe schon einiges versucht, aber irgendwie will es auf keine Art klappen.
Auf meine Art sehen die einzelnen Übergabeparameter wie folgt aus:

C:\>test.bat
if exist "\Documents
and
Settings\All
Users\Desktop\Quicktime
Player.lnk" del "\Documents
and
Settings\All
Users\Desktop\Quicktime
Player.lnk"

Wie kann ich die " so übergeben, dass sie erhalten bleiben und nicht von der Funktion verschluckt werden?

Danke

Content-Key: 183004

Url: https://administrator.de/contentid/183004

Printed on: April 26, 2024 at 04:04 o'clock

Member: Skyemugen
Skyemugen Apr 03, 2012 at 09:17:49 (UTC)
Goto Top
Aloha,

entschuldige, Baum?

Welche Anführungszeichen willst du jetzt wie? Irgendwie versteh ich's nicht so wirklich ... gib' doch mal bitte das Beispiel aus, wie es in der Ausgabe aussehen sollte, sonst verwirren mich die Tilde-Zeichen nämlich noch mehr ~

greetz André
Member: HuberDe
HuberDe Apr 03, 2012 at 09:29:05 (UTC)
Goto Top
Hmm, habe ich mich noch nicht deutlich genug ausgedrückt face-wink

Ich möchte zum Beispiel ein ganze einfaches Kommando wie

Del C:\blub abc\test.txt

in einer Batchfile ausführen. Das müsste ich dann allerdings so machen

Del "C:\blub abc\test.txt"

da im Pfad ein Leerzeichen enthalten ist. Wenn ich das jetzt jedoch an eine Batch Funktion übergebe,

CALL:testFunction Del "C:\blub abc\test.txt"

steht in

Argument1=Del

und in

Argument2=C:\blub abc\test.txt

ohne die oberen Anführungszeichen. Gleiches passiert, wenn ich die Anführungszeichen komplett drumrum mache:

CALL:testFunction "Del C:\blub abc\test.txt"

An für sich sollte ich ja sowas haben:

CALL:testFunction "Del "C:\blub abc\test.txt""

Denn die äußeren Anführungszeichen werden von der Funktion testFunction geschluckt. Und die Anderen sollten für den eigentlichen Del Befehl übrig bleiben.
Was jedoch dann in der Funktion ankommt, ist

Argument1: del "c:\blub
Argument2: abc\test.txt""

Ich hoffe jetzt ist es deutlicher face-wink
Member: Skyemugen
Skyemugen Apr 03, 2012 at 09:41:24 (UTC)
Goto Top
Aloha,

du hast schon den Wink mit der Tilde gelesen, oder?

Wenn man %~2 statt %2 nimmt, muss man sich nicht wundern, dass "C:\blub abc\test.txt" zu C:\blub abc\test.txt wird.

Als nächstes stellt sich mir die Frage, wenn da wirklich nur zwei Zeilen Loggesülze kommen, warum man unbedingt einen call setzen will und diese Problematik damit hervorruft?

An sich eine interessante Problematik ...

aber wie so oft: Sinn der Aktion? Muss man das jetzt so lösen wollen oder vergeudet man nur Zeit?

greetz André

P.S.:
set "Befehl="Del "C:\blub abc\test.txt"""  
oder wie? Nachwievor sinnlos aber als Übergabe machbar ...
set "Befehl="if exist "\Documents and Settings\All Users\Desktop\Quicktime Player.lnk" del "\Documents and Settings\All Users\Desktop\Quicktime Player.lnk"""  
%Befehl%>%temp%\sinnfrei.log 2>&1
Member: HuberDe
HuberDe Apr 03, 2012 at 09:54:55 (UTC)
Goto Top
Hmm,

vieleeeen Dank! So sieht es schon besser aus!

nein ehrlich gesagt habe ich die Tilde bislang ignoriert face-wink Was sagt mir denn diese Tilde? Warum wirft die Anführungszeichen weg?

Den "Aufwand" mache ich, da dies ja nur ein Minimalbeispiel ist. Im Endeffekt soll hier ja noch erhebliich mehr gemacht werden.
Member: Skyemugen
Skyemugen Apr 03, 2012 at 09:56:40 (UTC)
Goto Top
Zitat von @HuberDe:
nein ehrlich gesagt habe ich die Tilde bislang ignoriert face-wink Was sagt mir denn diese Tilde? Warum wirft die Anführungszeichen weg?
        %~1         - Expandiert %1 und entfernt umschließende
                      Anführungszeichen (").


Weil das so gewollt ist ... call /? anyone?

greetz André
Member: HuberDe
HuberDe Apr 03, 2012 at 10:05:53 (UTC)
Goto Top
Oje, ist das peinlich face-wink Ich bin bis dato noch nicht drauf gekommen in die Call Hilfe zu schauen. Ich dachte das wäre eine allgmeinere Übergabegeschichte. Naja vielen Dank nochmals face-wink