2014-11-05 29 views
6

Burada komut satırı parametresinde işareti kullanarak harika script ancak bunun yerine olsun 'b' dahili veya harici bir komut, çalıştırılabilir program veya toplu iş dosyası olarak tanınmıyor.Groovy:</p> İşte <pre><code>param = args[0] println(param) </code></pre> <p>bunu çalıştırmak nasıl (Windows 7):</p> <pre><code>groovy test.groovy a&b </code></pre> <p>beklediğim bu senaryo bir & b yazdırır

Alıntıdaki argümanı (benim durumumda bir &b) koymayı denedim, ancak yardımcı olmuyor. Çift tırnak ile, komut dosyası askıda kalıyor. Tek tırnak ile herhangi bir tırnak olmadan aynı hatayı alıyorum.

Soru: groovy script için ampersand komut satırı argümanı olarak bir dize almak mümkün mü? Windows üzerinde groovy yürütürken

+0

Bu mesaj groovy'nin kendisinden mi yoksa windows kabuğundan mı geliyor? MacOS'ta aşağıdaki çağrı ile mükemmel bir şekilde çalışır: 'groovy script.groovy a \ & b' – Opal

+0

Opal, windows kabuğundan gelir. Bir \ & b ile aynı hatayı aldım: 'b' bir iç veya dış komut, çalıştırılabilir program veya toplu iş dosyası olarak tanınmıyor. – Racoon

+1

yeniden oluşturdu. Bu bir windows komut satırı şeydir. Karat ile kaçmayı ve çift tırnak kullanmayı içeren bir dizi düzeltmeler var, bunların hiçbiri işe yaramıyor. –

cevap

5

, biz aslında (groovy.bat itibaren) sonra %GROOVY_HOME\groovy.bat yürütmek ve:

"%DIRNAME%\startGroovy.bat" "%DIRNAME%" groovy.ui.GroovyMain %*

içeri startGroovy.bat bakarsak aşağıda alıntı (argümanları ile başa çıkmak için gerçekten çirkin kesmek görebilirsiniz): startyGroovy.bat"a&b"

nedenle
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% 

, "kaçış "-qa&b-q için, komut dosyası içinde iki komut elde

'b-q' is not recognized as an internal or external command, 
operable program or batch file. 

elde ve süre sonsuz bir döngü neden," damaçla geliştirilmiş".

Groovy komut dosyasını çalıştırmadan önce set DEBUG=true ile görebilirsiniz. aşağıdaki gibi

kesmek demet başka hack ekleme, sen startGroovy.bat benzer şekilde da & kaçabilir:

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% 

ve çıkış yapılmış ...

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=-% 

Böylece:

groovy test.groovy "a&b" 
a&b 

Windows'ta daha açık/daha zarif bir çözümün bile mümkün olup olmadığından emin değilsiniz.

UNIX konsolunda 8 değerini veren groovy -e "println 2**3" ile benzer bir durum görebilirsiniz, ancak pencerelerde (sonsuz döngü) kilitleniyor.

+0

değerli yorum için çok teşekkür ederim! Bu seçeneği daha önce denedim, ama benim ortamımda (Windows 7 x64) groovy test.groovy "a & b" sadece ... – Racoon

+0

daha derin içine girmeme izin verin. Kaçış konusunda yanılmışım gibi görünüyor &. Daha çok deneyeceğim. – Racoon

+0

çalışıyor, teşekkürler! – Racoon