Как уже указывал пользователь Aacini в его комментарии , проблема вызвана этой строкой:
set /a xorAB=!a:~%pos%,1!^!b:~%pos%,1!
С каретки (^
) escape-символ , его необходимо защитить. Это может быть достигнуто путем удвоения или цитирования:
rem // Double the `^` in order to escape itself:
set /a xorAB=!a:~%pos%,1!^^!b:~%pos%,1!
rem // Or quote the whole expression to protect the `^`:
set /a "xorAB=!a:~%pos%,1!^!b:~%pos%,1!"
Однако, поскольку у вас включено отложенное расширение , которое также рассматривает ^
как escape-символ, вам необходимо защитить его еще раз, чтобы сохранить его:
rem // Quadruple the `^` in order to escape itself:
set /a xorAB=!a:~%pos%,1!^^^^!b:~%pos%,1!
rem // Or double it and quote the whole expression to protect them:
set /a "xorAB=!a:~%pos%,1!^^!b:~%pos%,1!"
Подробнее см. в этом разоблачающем потоке: Как синтаксический анализ сценариев Windows Command Interpreter (CMD.EXE)?