将包含感叹号(!)的参数从Windows命令行传递到groovy脚本会被剥离,因为Windows正在尝试使用延迟扩展来扩展变量名称(请参阅this,this和this)。发布了相当多的解决方案,其中包含以下解决方案之一:
这些都是公认的答案,所以显然它在某些情况下有效,但它不适合我。这是我在Windows 10 Professional上获得的行为:
C:\sof>type cmdtest.groovy
PASSWD=args[0]
println PASSWD
C:\sof>groovy cmdtest.groovy foopasswd!
foopasswd
C:\sof>groovy cmdtest.groovy foopasswd^^!
foopasswd
C:\sof>groovy cmdtest.groovy "foopasswd^!"
foopasswd
C:\sof>setlocal DisableDelayedExpansion
C:\sof>groovy cmdtest.groovy foopasswd!
foopasswd
C:\sof>groovy cmdtest.groovy foopasswd^^!
foopasswd
我认为它在某种程度上发生在groovy.bat
所以我也尝试将setlocal DisableDelayedExpansion
添加到groovy.bat
,它也没有用。
能以某种方式告诉我让上述cmdtest.groovy
尊重!的诀窍吗?
问题是文件groovy.bat
和startgroovy.bat
,它们包含差的批处理代码。
startgroovy.bat
可以延迟扩展,但不使用它!
通过使用qazxsw poi,将参数从qazxsw poi转移到qazxsw poi。
groovy.bat
在那里,第一个插入符将被删除,但有多少是未确定的,因为如果启用了延迟扩展,它就不可靠。在startgroovy.bat
中,延迟扩展已启用,参数由%*
等行存储。
那里将删除下一个插入符号。
但是当参数到达块时:
"%DIRNAME%\startGroovy.bat" "%DIRNAME%" groovy.ui.GroovyMain %*
所有的希望都消失了,这里不可能保留一个感叹号
如果要修复此问题,则需要使用-startgroovy.bat
替换所有set CP=%~2
表达式。
rem escape minus (-d), quotes (-q), star (-s).
set _ARGS=%*
if not defined _ARGS goto execute
set _ARGS=%_ARGS:-=-d%
set _ARGS=%_ARGS:"=-q%
...
但功能%ARGS:...%
也被打破了。
!ARGS:...!
set _ARGS=!_ARGS:-=-d!
set _ARGS=!_ARGS:"=-q!
不适用于插入符号/感叹号,这必须重构为:
:win9xME_args_loop
但我的结论是:不要尝试在密码中使用特殊字符。 完全重写groovy批处理文件是必要的,目前这些文件是反模式的一个很好的例子