[英]Passing exclamation mark (!) to groovy script via Windows batch/command script
從 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
尊重 !'s 的技巧嗎?
問題是文件groovy.bat
和startgroovy.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:...%
表達式替換為 - !ARGS:...!
.
set _ARGS=!_ARGS:-=-d!
set _ARGS=!_ARGS:"=-q!
但是函數:win9xME_args_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
call ... "%%i" "%%j"
不適用於插入符號/感嘆號,這必須重構為:
for /f "tokens=1,*" %%i in ("!_ARGS!") do (
set "_ARG=!_ARG! %%~i"
但我的結論是:不要嘗試在密碼中使用特殊字符。
需要徹底重寫 groovy 批處理文件,目前這些文件是反模式的一個很好的例子
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.