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