Я уверен, что это было задано и ответили раньше, но я не мог его найти.
Существует действительно крутое (и быстрое) решение, которое я видел где-то где-то. Он использует новый cmd.exe-процесс с опцией/U, поэтому вывод выполняется в Юникоде. Интересная вещь о юникоде состоит в том, что каждый символ ASCII представлен как сам, за которым следует нулевой байт (0x00). Когда это передается через MORE, он преобразует nul байты в символы новой строки !. Затем FOR/F используется для итерации каждого из символов и построения нужной строки. Последняя операция подстроки используется для удаления дополнительных +
спереди.
Я немного изменил свою память о коде, играя в игры с escape-последовательностями, чтобы получить замедленное расширение в правильное время и защитить персонажа при его добавлении - все, чтобы получить технику для сохранения ^
и !
символов. Это может быть новым поводом для существующих размещенных кодов с использованием этой общей техники.
@echo off
setlocal enableDelayedExpansion
set "str=Server bang^! caret^^"
set "out="
for /f delims^=^ eol^= %%A in ('cmd /u /v:on /c echo(^^!str^^!^|more') do set "out=!out!+^%%A"
set "out=!out:~1!"
echo Before: !str!
echo After: !out!
--output ---
Before: Server bang! caret^
After: S+e+r+v+e+r+ +b+a+n+g+!+ +c+a+r+e+t+^
Удивительная благодарность! – user754730