У вас много проблем, так как специальные символы будут оцениваться несколько раз в вашем случае.
Сначала в команде set
фаза специальных символов уменьшит вашу строку "^^!^^^&^^^^"
до
^!^&^^
Но так как расширение с задержкой включено, и ваша строка содержит восклицательный знак,
будет включена другая фаза, чтобы снова уменьшить количество карет до.
!&^
В этот момент param1
содержит !&^
, вы можете проверить его с помощью set param1
Но когда вы попытаетесь отобразить значение с помощью echo %param1%
, будет выполнено другое расширение.
И теперь у вас возникнет проблема: %param1%
расширится до !&^
,
Восклицательный знак будет удален,так как второй восклицательный знак отсутствует для расширения переменной,
амперсанд будет рассматриваться как новый разделитель команд и
конечный символ будет считаться многострочным символом.
echo ! & ^<next line>
Здесь гораздо безопаснее использовать отложенное расширение, так как это никогда не изменит содержимое, так как этот этап является последним в синтаксическом анализаторе.
setlocal EnableDelayedExpansion
set param1=%~1
set param1
echo !param1!
И все эти объяснения можно найти на Как CMD.EXE анализирует скрипты?