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

时间:2017-03-16 18:01:44

标签: 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网址(例如https://www.google.de/search?q=test&oq=test&aqs=chrome..69i57j69i60j69i65l3j69i60.704j0j9&sourceid=chrome&ie=UTF-8),则由于&符号,它会返回错误。

如何停止对&符号的解释,只需用url替换我的变量xxgs?

1 个答案:

答案 0 :(得分:2)

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

由于您使用嵌套在延迟扩展表达式中的此变量(即子字符串替换%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%%~b的实际子字符串替换完成之前仍然展开,因此它提供了预期的输出。表达式line中的外部引号对被""!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;