Передача восклицательного знака (!) В Groovy скрипт через командный / командный скрипт Windows - PullRequest
1 голос
/ 25 апреля 2019

Передача аргумента, содержащего восклицательный знак (!), В скрипт groovy из командной строки Windows удаляется, поскольку Windows пытается расширить имя переменной с помощью отложенного расширения (см. this , это и это ). Опубликовано довольно много решений, включающих одно из этих решений:

  • 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 уважать!

1 Ответ

1 голос
/ 25 апреля 2019

Проблема в том, что файлы 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:...% выражения на - !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 командных файлов, в настоящее время файлы являются хорошим примером анти-паттерна

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...