После многих лет использования пакетных файлов я с удивлением обнаружил, что знак равенства '=' считается разделителем аргументов.
Данный тестовый скрипт:
echo arg1: %1
echo arg2: %2
echo arg3: %3
и вызов:
test.bat a=b c
вывод:
arg1: a
arg2: b
arg3: c
Почему это так и как этого можно избежать? Я не хочу, чтобы пользователь скрипта учел эту причуду и процитировал «a = b», что нелогично.
Этот пакетный скрипт был запущен в Windows 7.
===== РЕДАКТИРОВАТЬ =====
Немного больше предыстории: я столкнулся с этой проблемой при написании файла bat для запуска приложения Java. Я хотел использовать некоторые аргументы в файле bat, а затем передать остальное в Java-приложение. Поэтому моей первой попыткой было сделать shift
, а затем перестроить список аргументов (так как shift
не затрагивается *1020*). Это выглядело примерно так, и вот когда я обнаружил проблему:
rem Rebuild the args, %* does not work after shift
:args
if not "%1" == "" (
set ARGS=!ARGS! %1
shift
goto args
)
Следующим шагом было больше не использовать сдвиг, а реализовать сдвиг вручную, удаляя по одному символу за раз из %*
, пока не встретится пробел:
rem Remove the 1st arg if it was the profile
set ARGS=%*
if not "%FIRST_ARG%" == "%KNOA_PROFILE%" goto remove_first_done
:remove_first
if not defined ARGS goto remove_first_done
if "%ARGS:~0,1%" == " " goto remove_first_done
set ARGS=%ARGS:~1%
goto remove_first
:remove_first_done
Но это уродливо и может все же потерпеть неудачу в некоторых случаях, которые я не рассматривал Итак, в конце концов я решил написать программу на Java для разбора аргументов! В моем случае это нормально, так как я запускаю сервер и штраф за дополнительный вызов Java минимален. Это ошеломляет то, что ты иногда делаешь.
Вы можете спросить, почему я не позаботился об аргументах в самом приложении Java? Ответ в том, что я хочу иметь возможность передавать параметры JVM, такие как -Xmx, которые должны быть обработаны перед вызовом java.