需要编写一个批处理脚本,用 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
中找到之后;自 %%~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
的语法在循环结构中更改为引用的结构set "line=%%a"
;
关于windows - 如何忽略 url 中的符号以替换批处理脚本中的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42841621/