簡體   English   中英

通過 Windows 批處理/命令腳本將感嘆號 (!) 傳遞給 groovy 腳本

[英]Passing exclamation mark (!) to groovy script via Windows batch/command script

從 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尊重 !'s 的技巧嗎?

問題是文件groovy.batstartgroovy.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM