windows - 如何忽略 url 中的符号以替换批处理脚本中的字符串?

标签 windows batch-file replace cmd

需要编写一个批处理脚本,用 HTML 文档中的 URL 替换变量。 URL 来自用户输入。

@echo off
setlocal DisableDelayedExpansion
set /p vargs="Google Search: "
set "search=xxgs"
set "replace=%vargs%"
del output.html
for /F "delims=" %%a in (test.html) DO (
   set line=%%a
   setlocal EnableDelayedExpansion
   >> output.txt echo(!line:%search%=%replace%!
   endlocal
)

如果我粘贴一个 Google URL(例如 https://www.google.de/search?q=test&oq=test&aqs=chrome..69i57j69i60j69i65l3j69i60.704j0j9&sourceid=chrome&ie=UTF-8),它会返回一个错误,因为和号。

我怎样才能停止对 & 符号的解释,而只用 url 替换我的变量 xxgs?

最佳答案

问题在于和号(以及其他一些字符)对 cmd 具有特殊含义,以及您正在扩展变量 replace 的事实使用正常(立即)百分比扩展(%replace%)。

由于您正在使用嵌套在延迟扩展表达式(即子字符串替换 !line:%search%=%replace%! )中的此变量,因此不能对 replace 使用延迟扩展.但是,您可以通过使用另一个 for /F 来延迟值扩展。循环,如 for在处理特殊字符(如 ^&()"<>|)后,变量也会扩展:

@echo off
setlocal DisableDelayedExpansion
set "vargs="
set /p vargs="Google Search: "
set "search=xxgs"
set "replace=%vargs%"
> "output.txt" (
    for /F "usebackq delims=" %%a in ("test.html") do (
        set "line=%%a"
        setlocal EnableDelayedExpansion
        for /F "delims=" %%b in (""!replace!"") do (
            echo(!line:%search%=%%~b!
        )
        endlocal
    )
)

内部for /F循环接收 !replace! 的值,可在 %%~b 中找到之后;自 %%~bline 的实际子字符串替换之前仍然展开完成后,它提供了预期的输出。表达式 ""!replace!"" 中的外引号对被 for /F 删除并告诉它将余数视为文字字符串(因为没有 usebackq 选项);内对 ""for /F 处理连同 replace 的值然后被 ~ 删除%%~b 中的修饰符;使用这个技巧,循环甚至在 replace 的情况下执行为空,因为字符串显示为 ""for /F (请注意,循环会忽略空字符串/行),因此即使用户在提示中不输入任何内容,脚本也能正常工作。如果您不希望出现此行为并在用户输入为空时跳过子字符串替换,只需删除外部引号对 "" 即可。并替换 %%~b%%b .

请注意 replace 的值中带有感叹号仍然导致意想不到的结果,因为for在处理延迟扩展之前扩展变量,这会消耗 !字符。

除此之外,我更改了以下内容:

  • 变量vargs在提示 set /P vargs= 之前被清除,所以当用户什么都不输入时,vargs确实是空的,因为 set /P在没有输入的情况下保持之前的值;
  • 我没有将每一行都写入输出文件,而是重定向了整个 for /F文件的循环结构output.txt只有一次;因为这允许使用 >运算符而不是 >> ,输出文件不必再提前删除(虽然你删除了 output.html 而不是 output.txt ,但我认为这只是一个错字);
  • 我添加了 usebackq for /F 的选项并引用文件路径/名称,因此它甚至可能包含空格或特殊字符;
  • set的语法在循环结构中更改为引用的结构 set "line=%%a" ;

关于windows - 如何忽略 url 中的符号以替换批处理脚本中的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42841621/

相关文章:

windows - 我应该引用哪个 git.exe?

python - 如何使用 Python 下载 YouTube 音频?

c++ - 不正确的值被打印到文件中。串口通信程序

windows - 通过 ftp 下载文件的批处理脚本,我该如何处理覆盖

c++ - 如何用特定符号查找和替换字符串中的所有字符 C++

C 程序生成随机大写字符串并替换值

c++ - 如何检查 string::append() 是否会失败

batch-file - 如何在 DOS 中回显字符串“off”

python - 在 Linux 中拖放等效的批处理文件

c# - 我怎样才能加快这个循环?是否有一次替换多个术语的类?