【问题标题】:batch: How to write text to file without expanding the variables批处理:如何在不扩展变量的情况下将文本写入文件
【发布时间】:2020-05-03 07:58:11
【问题描述】:

我正在尝试使用批处理文件将文本写入文件:

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%%%%"

但是假设我不知道这条线是什么样子我只知道它有百分号我应该如何继续?我唯一想做的就是将行原样写入文本文件而不进行任何操作。

【问题讨论】:

  • ...?q=%clipboard%% -- 这真的是您要保留的文字 URL 字符串,还是应该读为 ...?q=%clipboard%

标签: windows batch-file


【解决方案1】:

当您在批处理文件中定义文字字符串时,例如set "Text=A single %%-sign"echo A single %%-sign,您总是需要手动加倍%-signs;否则,%-expansion 阶段会消耗它们并尝试扩展变量(有关详细信息,请参阅此answer)。

但是,当输入文本来自其他地方时,例如用户输入 (set /P Text="Enter text: ") 或来自文件(例如,由 for /F 读取),您不必手动加倍 %-signs,因为%-expansion 阶段在文本到达时已经完成。


这是我认识到真正问题之前的原始答案:

好吧,您的代码中的以下行不起作用:

set "Text=%Text:^%=%%%"

因为,除了它实际上会替换 ^% 而不是 % 之外,%-sign 后面的 =-sign 完成了这个子字符串替换表达式,剩下的 %% 变成然后用单个文字 % 替换(有关更多详细信息,请参阅此 answer)。

要在任意字符串中加倍%-signs,您需要启用delayed expansion,因为这使用! 而不是% 来标记变量,这不会干扰文字%-signs 您想要替换/加倍:

@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

【讨论】:

  • 谢谢,这似乎可行,但前提是字符串以 %%clipboard%% 结尾,但实际上是 %clipboard%% 并且我不知道字符串将如何我只有知道里面有百分号...
  • 当您必须将输入字符串放入脚本(如set "Text=...")时,您将始终必须手动将%-signs 加倍;当输入来自用户(set /P Text="Please type a string: ")或文件(例如< "file.txt" set /P Text="")时,您不必手动加倍;那么你的字符串实际上是从哪里来的呢?
  • 抱歉,当您解析文本文件并将替换变量传递给普通变量时,实际上我犯了一个错误,它得到了正确的链接。
  • 所以问题实际上只有在您手动将值传递给变量时才会发生......
  • 是的,没错...似乎我们试图解决XY Problem,不是吗? ;-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-23
  • 1970-01-01
  • 2012-10-30
  • 2017-11-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多