需要编写批处理脚本,用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?
答案 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
;