Когда вы определяете литеральную строку в пакетном файле, например set "Text=A single %%-sign"
или echo A single %%-sign
, вам всегда нужно вручную удваивать %
-signs; в противном случае фаза расширения %
потребляет их и пытается расширить переменные (см. этот ответ для получения более подробной информации).
Однако, когда вводимый текст приходит откуда-то еще, например пользовательский ввод (set /P Text="Enter text: "
) или из файла (например, прочитанного for /F
) вам не нужно вручную удваивать %
-знаки, потому что фаза расширения %
уже завершена, когда приходит текст.
Это оригинальный ответ до того, как я осознал реальную проблему:
Ну, следующая строка в вашем коде не может работать:
set "Text=%Text:^%=%%%"
Поскольку, помимо того факта, что он на самом деле заменит ^%
, а не %
, знак %
за знаком =
завершает это выражение подстановки подстроки, а оставшиеся %%
становятся затем заменяется одним литералом %
(подробнее см. этот ответ ).
Чтобы удвоить %
-символы в произвольной строке, необходимо включить отложенное расширение , потому что это использует * 103 6 * вместо %
для обозначения переменных, которые не мешают буквальным %
-символам, которые вы хотите заменить / double:
@echo off
rem /* You have to double `%`-signs when you put a literal string here; so
rem this literaly sets `https://www.google.com/search?q=%clipboard%`: */
set "Text=https://www.google.com/search?q=%%clipboard%%"
rem // Enable delayed expansion:
setlocal EnableDelayedExpansion
rem // Literal `%`-signs still have to be doubled here:
set "Text=!Text:%%=%%%%!"
rem // Return the string with `%`-signs doubled:
echo Delayed expansion: !Text!
echo Normal expansion: %Text%
set Text & rem // (avoiding `echo` here to review the true variable value)
rem // Variables set/changed since `setlocal` become lost past this point:
endlocal