2014-11-05 2 views
6

Hier ist die groovy Skript:Groovy: mit Et-Zeichen in den Befehlszeilenparameter

param = args[0] 
println(param) 

Hier ist, wie ich es (Windows 7) laufen:

groovy test.groovy a&b 

Ich erwarte, dass dieses Skript druckt eine & b , aber stattdessen wird 'b' nicht als interner oder externer Befehl, ausführbares Programm oder Batch-Datei erkannt.

Ich habe versucht, das Argument (a & b in meinem Fall) in Anführungszeichen setzen, aber es hilft nicht. Bei doppelten Anführungszeichen hängt das Skript. Mit einfachen Anführungszeichen bekomme ich den gleichen Fehler wie ohne Anführungszeichen.

Frage: ist es möglich, eine Zeichenfolge mit Ampersand als Befehlszeilenargument für grooviges Skript zu nehmen?

+0

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

+0

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

+1

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. –

Antwort

5

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.

+0

Vielen Dank für den wertvollen Kommentar! Ich habe diese Option früher versucht, aber in meiner Umgebung (Windows 7 x64) groovy test.groovy "a & b" hängt einfach ... – Racoon

+0

lassen Sie mich tiefer hineingehen. Es sieht so aus, als hätte ich mich geirrt bei der Flucht. Ich werde mehr versuchen. – Racoon

+0

es funktioniert, danke! – Racoon

Verwandte Themen