需要编写批处理脚本,用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 /F
和replace
的值一起处理,之后被%%~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"
;