如何忽略一个URL中的&符号来replace批处理脚本中的string?

需要编写批处理脚本,用HTML文档中的URLreplacevariables。 该url来自用户input。

@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 ) 

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

我怎样才能停止&符号的解释,只需将我的variablesxxgsreplace为url?

问题是,&符号(还有一些其他字符)对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!的值!replace! ,稍后在%%~b可用; 由于%%~b在实际的子line更换完成之前仍然展开,因此它提供了预期的输出。 表达式""!replace!""的外部双引号被for /F移除,并告诉它将余数看作一个文字字符串(因为没有usebackq选项)。 内部对""for /Freplace的值一起处理,之后被%%~b~修饰符移除; 有了这个技巧,循环甚至在replace为空的情况下执行,因为字符串显示为"" for /F (注意循环忽略空的字符串/行),所以即使用户在提示符中没有输入任何内容。 如果您不想要这种行为,并且在空的用户输入时跳过子字符串替换,只需删除外部的一对引号""并用%%~b替换%%~b %%b

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

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

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