Как я могу получить пароль, содержащий каретку (^), переданную в качестве параметра в командный файл Windows без изменений? - PullRequest
12 голосов
/ 10 марта 2011

Сводка:
В командной строке (в Windows Server 2003 R2) я набираю:

> SET password=a^b  
> ECHO %password%

И результат «ab».Куда пошла эта чертова карета (^)?Затем я попытался «убежать» с помощью ^^, `^,% ^, ^^^, и ни один из них не работал, чтобы когда-либо пройти через каретку к команде echo.Этот пакетный файл находится в середине.Таким образом, я не могу ни изменить пароль исходной системы, чтобы избежать использования каретки, ни изменить пароль целевой системы, чтобы не синхронизировать его с исходной системой.

Подробности:
Я искал Google, а затем ТАК.И хотя у меня теперь есть несколько советов о том, как лучше спроектировать мой кровавый пакетный файл 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", где ... - это набор параметров и библиотечный шум, не относящийся к этой проблеме.Кровавая карета (^) исчезла.

Я испробовал все возможные стратегии побега, пытаясь заставить карету появиться.Я не смог найти ничего, что могло бы привести к появлению каретки ... за исключением того, что я заключил пароль в кавычки, как я набрал:

> run the_name "the_pass^word"

... и тогда полученная командная строка выглядит так:

java...config.user_name=the_name config.password="the_pass^word"

т.е. я получаю символ вставки, но теперь в содержимом строки появляются кавычки ... что, естественно, не работает для приложения, которому они передаются.

У кого-нибудь есть очевидный совет или трюк, который я пропустил, чтобы иметь то, что вводится в качестве параметров в командной строке, передаваемых через UNTOUCHED для моего внутреннего использования?Фактически это значение прибывает в переменную пакетного файла% 2.Но к тому времени, когда я впервые увидел содержимое% 2, оно было «разморозлено».

UGH, я не фанат пакетных файлов Windows.

Обновление:
Большое спасибо ответу Джошуа МакКиннона.Я выбрал его в качестве ответа, поскольку это решило мою непосредственную проблему.Однако я хотел бы более подробно остановиться на решениях (да, во множественном числе).

  1. Нет необходимости использовать любую форму SetLocal / EndLocal
  2. Необходимо использовать синтаксис стиля% ~ 1 -не найдена форма синтаксиса% 1, которая работала для сохранения каретки
  3. Решение: без кавычек используйте 4 последовательных каретки (например: используйте пароль ^^^^ word для создания пароля ^ word)
  4. Решение: в кавычках используйте 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 часов касательных, пытаясь выследить эту особенность (больше похоже на идиот-синхронность).

Ответы [ 4 ]

9 голосов
/ 10 марта 2011

Согласно этой странице , & | (<> ^ - это все зарезервированные символы в пакетных файлах Windows. ^ Является escape-символом, а также символом продолжения строки. ^^ должен давать вам ^, но тогда это ^ может потребоваться экранировать.

Чтобы получить пароль через ввод, вы пытались увеличить число карет в четыре раза?

e.g.:  my_batch.cmd the_pass^^^^word
3 голосов
/ 15 сентября 2016

Это объясняет проблему:

http://www.robvanderwoude.com/battech_inputvalidation_commandline.php

Если вы обрабатываете произвольные строки в командном файле / сценарии CMD, не передавайте их через аргументы командной строки! Вместо этого поместите их в файл и дайте пакетному файлу прочитать его. Поскольку проверка и очистка в аргументах командной строки никогда не бывают безошибочными.

2 голосов
/ 10 марта 2011

Основная проблема заключается в том, что символы каретки и другие специальные символы обрабатываются всегда, когда они находятся в строке (вне кавычек).
Контент анализируется также, когда он расширяется на %var%, но не для отложенного расширения с !var!

Sample

@echo off
setlocal Enabledelayedexpansion

set variabl=-^^"^^-
set variabl
echo delayed !variabl!
echo percent %variabl%

--- Output ---
variabl=-^"^^-
delayed -^"^^-
percent -"^-

Содержимое переменной равно -^"^^-, что является проблемой строки set. Но каретки снова работают только как escape-символы, при использовании их с %var%.

0 голосов
/ 10 марта 2011

Может быть проще снять цитаты.См. SO ссылка для получения дополнительной информации.

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