Как я могу получить пароль с кареткой (^), переданной без изменений в качестве параметра в пакетный файл 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/... для получения некоторой информации.