Как я могу получить пароль с кареткой (^), переданной без изменений в качестве параметра в пакетный файл Windows?
Резюме:
В командной строке (в Windows Server 2003 R2) введите:
> SET password=a^b
> ECHO %password%
И результатом будет "ab". Куда ушла фракийская карета (^)? Затем я попытался "убежать" от него с помощью ^^, `^,% ^, ^^^, и ни одна из них не проработала, чтобы пройти каретку до команды эха. Этот командный файл находится посередине. Таким образом, я не могу ни изменить пароль исходной системы, чтобы избежать использования каретки, так и не могу изменить целевой системный пароль, чтобы он не синхронизировался с исходной системой.
Детали:
Я искал Google, а затем SO. И хотя у меня теперь есть bazillion советы о том, как лучше спроектировать мой кровавый пакетный файл Windows, моя проблема остается.
У меня есть командный файл под названием run.bat, который состоит из серии инструкций SET, устанавливающих контекст для запуска приложения командной строки Java. После "cd" в соответствующей папке в командной строке в командной строке (в Windows Server 2003 R2) введите:
> run the_name the_pass^word
Когда я смотрю на вывод, отобранный в командной строке, я вижу "java... config.user_name = the_name config.password = the_password", где... представляет собой кучу параметров и библиотек, которые не имеют отношения к этому проблема. Черная каретка (^) исчезла.
Я пробовал всевозможные стратегии побега, которые я мог найти, пытаясь заставить каретку появиться. Я не смог найти ничего, что вызовет появление каретки... кроме окружения паролем с цитатой, как и в I, введите:
> run the_name "the_pass^word"
... и затем получившаяся строка командной строки выглядит так:
java...config.user_name=the_name config.password="the_pass^word"
то есть. Я получаю каретку, но кавычки теперь появляются в содержимом строки... что естественно не работает для приложения, к которому они передаются.
Есть ли у кого-нибудь очевидный совет или трюк, который я пропустил, чтобы получить то, что набрано в качестве параметров командной строки, прошедших через UNTOUCHED, к моему внутреннему использованию? Фактически это значение входит в переменную пакетного файла% 2. Но, к тому моменту, когда я впервые увижу содержимое% 2, оно было "разморожено".
UGH, я не поклонник пакетных файлов Windows.
Update:
Большое спасибо реакции Джошуа Маккиннона. Я выбрал его как ответ, так как решил мою ближайшую проблему. Однако я хотел бы подробнее остановиться на решениях (да, множественном числе).
- Не нужно использовать любую форму SetLocal/EndLocal
- Должен использовать синтаксис стиля% ~ 1 - не нашел формы синтаксиса% 1, который работал для сохранения каретки
- Решение: без кавычек, используйте 4 последовательных каретки (например: используйте pass ^^^^ слово для создания pass ^ word)
- Решение. Цитируется, используйте 2 последовательных каретки (например: используйте "pass ^^ word" для создания pass ^ word)
В пакетном файле "run.bat" используйте синтаксис% ~ 1, как в:
java MyClass username=%~1 password=%~2
... и затем в командной строке введите:
> run mr_clean puke^^^^boy
или
> run mr_clean "puke^^boy"
который затем приведет к тому, что окончательный исполняемый оператор будет выглядеть следующим образом:
java MyClass username=mr_clean password=puke^boy
Надеюсь, это поможет другому сэкономить некоторое время. Я закончил на 6 часах касательных, пытающихся выследить эту идиосинкразию (более похожую на идиот-синхронность).
Ответы
Ответ 1
Согласно эта страница, & | (< > ^ - это все зарезервированные символы в пакетных файлах Windows. ^ - это escape-символ, а также символ продолжения строки. ^^ должен дать вам символ ^, но тогда это может быть возможно экранировано.
Чтобы получить пароль через вход, попробовали ли вы увеличить число карманов в четыре раза?
e.g.: my_batch.cmd the_pass^^^^word
Ответ 2
Это объясняет проблему:
http://www.robvanderwoude.com/battech_inputvalidation_commandline.php
Если вы обрабатываете произвольные строки в пакетном файле /CMD script, не передавайте его через аргументы командной строки! Вместо этого поместите их в файл и дайте пакетному файлу прочитать его. Поскольку проверка и дезинфекция в аргументах командной строки никогда не являются безупречными.
Ответ 3
Основная проблема заключается в том, что каретки и другие специальные символы обрабатываются всегда, когда они находятся в строке (вне кавычек).
Содержимое анализируется также, когда оно расширяется на %var%
, но не для задержанного расширения с помощью !var!
Пример
@echo off
setlocal Enabledelayedexpansion
set variabl=-^^"^^-
set variabl
echo delayed !variabl!
echo percent %variabl%
--- Output ---
variabl=-^"^^-
delayed -^"^^-
percent -"^-
Содержимое variabl равно -^"^^-
, то есть проблема строки set
.
Но каретки снова работают только как escape-символы, используя их с %var%
.
Ответ 4
Может быть, проще снять кавычки. См. Ссылку fooobar.com/info/148870/... для получения некоторой информации.