экранировать все символы в пакетной переменной - PullRequest
1 голос
/ 04 мая 2020

Привет всем, поэтому у меня есть следующая пакетная переменная %~4, которая является именем пользователя. В настоящее время у меня проблема, потому что у меня была регистрация пользователя с именем пользователя Scott123! ! не читается правильно. Я попытался избежать этого, как это "%~4", и это работает на большинстве персонажей, но не на! персонаж. Кто-нибудь придумал решение для этого?

Ответы [ 2 ]

0 голосов
/ 06 мая 2020

Один из способов заставить его работать - это закомментировать SETLOCAL ENABLEDELAYEDEXPANSION и поместить "" вокруг переменной.

0 голосов
/ 05 мая 2020

Вы можете попробовать set username="%~4:!=^^!" заменить любой ! на экранированный восклицательный знак (возможно, вам нужно сначала присвоить %~4 другой переменной).

Возможно, вам придется рассмотреть вопрос о замене < > % | = , : & CON LPT1 и других ключевых слов / символов, которые являются специальными в пакетных файлах, чтобы предотвратить «инъекцию пакетных файлов»;)
Если я правильно помню, только ! требуется двойная каретка в качестве escape-символа (обычно используется для обозначения переменных отложенного расширения). Символ процента также является специальным, ему нужно экранировать еще один символ процента %%. Полагаю, что если вам также понадобится сбежать из каретки, все будет сложно,

ss64.com может помочь вам получить полный обзор всех особых случаев: https://ss64.com/nt/syntax-esc.html

Замена строки в переменных описана в справке для set. Выполните set /? в окне командной строки, чтобы прочитать его. Или попробуйте ss64, возможно, это будет более исчерпывающее чтение (https://ss64.com/nt/set.html).

Если в пакетном файле ничего не работает или требует больших усилий, вам нужно заранее экранировать эти символы где-нибудь еще. А еще лучше, запретите им вводить имя пользователя целиком. Тогда потребность в побеге отменяется.

...