Wenn groovy
unter Windows ausgeführt wird, wir %GROOVY_HOME\groovy.bat
tatsächlich ausführen und dann (von groovy.bat
):
"%DIRNAME%\startGroovy.bat" "%DIRNAME%" groovy.ui.GroovyMain %*
Wenn wir innerhalb startGroovy.bat
betrachten, können wir einen wirklich hässlichen Hack umgeht mit Argumenten (Auszug siehe unten):
rem horrible roll your own arg processing inspired by jruby equivalent
rem escape minus (-d), quotes (-q), star (-s).
set _ARGS=%*
if not defined _ARGS goto execute
set _ARGS=%_ARGS:-=-d%
set _ARGS=%_ARGS:"=-q%
set _ARGS=%_ARGS:?=-n%
rem Windowz will try to match * with files so we escape it here
rem but it is also a meta char for env var string substitution
rem so it can't be first char here, hack just for common cases.
rem If in doubt use a space or bracket before * if using -e.
set _ARGS=%_ARGS: *= -s%
set _ARGS=%_ARGS:)*=)-s%
set _ARGS=%_ARGS:0*=0-s%
set _ARGS=%_ARGS:1*=1-s%
set _ARGS=%_ARGS:2*=2-s%
set _ARGS=%_ARGS:3*=3-s%
set _ARGS=%_ARGS:4*=4-s%
set _ARGS=%_ARGS:5*=5-s%
set _ARGS=%_ARGS:6*=6-s%
set _ARGS=%_ARGS:7*=7-s%
set _ARGS=%_ARGS:8*=8-s%
set _ARGS=%_ARGS:9*=9-s%
Daher innerhalb startyGroovy.bat
"a&b"
ist "Flucht d "zu -qa&b-q
, in zwei Befehlen innerhalb des Skript resultierende,
'b-q' is not recognized as an internal or external command,
operable program or batch file.
und Bewirken, dass eine unendliche Schleife, während Nachgeben" URL-Kodierung “.
Sie können es mit set DEBUG=true
sehen, bevor Sie Ihr groovy Skript laufen lassen.
einen weiteren Hack auf die Reihe von Hacks hinzufügen, können Sie entkommen auch &
in ähnlicher Weise in startGroovy.bat
wie folgt:
rem escape minus (-d), quotes (-q), star (-s).
rem jalopaba escape ampersand (-m)
set _ARGS=%*
if not defined _ARGS goto execute
set _ARGS=%_ARGS:-=-d%
set _ARGS=%_ARGS:&=-m%
set _ARGS=%_ARGS:"=-q%
set _ARGS=%_ARGS:?=-n%
und unescape ...
rem now unescape -s, -q, -n, -d
rem jalopaba unescape -m
rem -d must be the last to be unescaped
set _ARG=%_ARG:-s=*%
set _ARG=%_ARG:-q="%
set _ARG=%_ARG:-n=?%
set _ARG=%_ARG:-m=&%
set _ARG=%_ARG:-d=-%
So dass:
groovy test.groovy "a&b"
a&b
Nicht sicher, ob eine klarere/elegantere Lösung in Windows überhaupt möglich ist.
Sie können einen ähnlichen Fall mit groovy -e "println 2**3"
sehen, die 8
in UNIX-Konsole liefert, aber hängt (Endlosschleife) in Windows.
Kommt diese Nachricht von groovy selbst oder von Windows Shell? Auf MacOS funktioniert es perfekt mit dem folgenden Aufruf: 'groovy script.groovy a \ & b' – Opal
Opal, kommt es aus Windows-Shell. Mit a \ & b habe ich den gleichen Fehler: 'b' wird nicht als interner oder externer Befehl, ausführbares Programm oder Batch-Datei erkannt. – Racoon
reproduziert es. Dies ist eine Windows-Kommandozeilen-Sache. Es gibt eine Reihe von vorgeschlagenen Korrekturen, bei denen es darum geht, mit Karat zu entkommen und doppelte Anführungszeichen zu verwenden. Keiner von ihnen scheint zu funktionieren. –