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

Batch file 通过Windows批处理/命令脚本向groovy脚本传递感叹号(!),batch-file,groovy,Batch File,Groovy,从Windows命令行向groovy脚本传递包含感叹号(!)的参数会被剥离,因为Windows正在尝试使用延迟扩展来扩展变量名(请参阅和)。发布了许多解决方案,其中包括: setlocal ENABLEDELAYEDEXPANSION 使用引号转义“^!” 无引号转义^^ 这些都是公认的答案,所以在某些情况下显然是有效的,但对我来说却不起作用。以下是我在Windows 10 Professional上的行为: C:\sof>type cmdtest.groovy PASSWD=args

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

  • 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
中发生的,所以我还尝试将
setlocaldisabledelayedexpansion
添加到
groovy.bat
中,但它也不起作用


你能告诉我如何让上面的
cmdtest.groovy尊重问题是文件
groovy.bat
startgroovy.bat
,它们包含糟糕的批处理代码。
startgroovy.bat
启用延迟扩展,但不使用它

使用行中的
%*
将参数从
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:…%
表达式替换为-
!阿格斯:

set _ARGS=!_ARGS:-=-d!
set _ARGS=!_ARGS:"=-q!
但是函数
:win9xME\u args\u loop
也被破坏

:win9xME_args_loop
rem split args by spaces into first and rest
for /f "tokens=1,*" %%i in (!_ARGS!) do call :get_arg "%%i" "%%j"
goto process_arg
调用。。。“%%i”“%%j”
不能与插入符号/感叹号一起使用,必须将其重构为类似以下内容:

for /f "tokens=1,*" %%i in ("!_ARGS!") do (
   set "_ARG=!_ARG! %%~i"
但我的结论是:不要试图在密码中使用特殊字符。

完全重写groovy批处理文件是必要的,目前这些文件是反模式的一个好例子

lol!谢谢你写的这篇有趣且内容丰富的文章!如果这变得如此重要,我会把它作为指导,但现在我会接受你的建议,只是要注意特殊的角色。在我们的场景中,这是一个边缘案例,但它让我抓狂,我想了解这个问题。谢谢你的帮助。