Пакет: Как записать текст в файл без расширения переменных - PullRequest
0 голосов
/ 03 мая 2020

Я пытаюсь записать текст в файл, используя командный файл:

start https://www.google.com/search?q=%clipboard%%"

@echo off
set "Text=start https://www.google.com/search?q=%clipboard%%"
set "Text=%Text:^%=%%%"
echo %Text%>>lala.txt

Но в текстовый файл записывается только:

start https://www.google.com/search?q=%

Идея это дублировать знаки процента, чтобы они экранировались и рассматривались только как текст, но я думаю, что для некоторого повторения пакет все еще является переменной. Я знаю, что могу просто использовать:

echo start https://www.google.com/search?q=%%clipboard%%%%"

Но скажем, я не знаю, как выглядит линия, я знаю только, что в ней есть знаки процента, как мне действовать? Единственное, что я хочу сделать, это написать строку в текстовом файле без каких-либо манипуляций.

1 Ответ

3 голосов
/ 03 мая 2020

Когда вы определяете литеральную строку в пакетном файле, например 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...