通过Windows批处理/命令脚本将感叹号(!)传递给groovy脚本

问题描述 投票:1回答:1

将包含感叹号(!)的参数从Windows命令行传递到groovy脚本会被剥离,因为Windows正在尝试使用延迟扩展来扩展变量名称(请参阅thisthisthis)。发布了相当多的解决方案,其中包含以下解决方案之一:

  • setlocal ENABLEDELAYEDEXPANSION
  • 逃避“引号^!”
  • 逃脱没有引号^^!

这些都是公认的答案,所以显然它在某些情况下有效,但它不适合我。这是我在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尊重!的诀窍吗?

batch-file groovy
1个回答
1
投票

问题是文件groovy.batstartgroovy.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批处理文件是必要的,目前这些文件是反模式的一个很好的例子

© www.soinside.com 2019 - 2024. All rights reserved.