Резюме:
В командной строке (в 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 часах касательных, пытающихся выследить эту идиосинкразию (более похожую на идиот-синхронность).