Windows 使用批处理文件编辑字符串中的单词
这是我到目前为止写的:Windows 使用批处理文件编辑字符串中的单词,windows,batch-file,cmd,Windows,Batch File,Cmd,这是我到目前为止写的: for /l %%x in (Veronica, Nils, Mike, Tom) do ( set word=%%x set str="My name is Name" call set str=%%str:Name=%word%%% echo %str% >> names.txt ) 不幸的是,唯一的输出是: ECHO is on. ECHO is on. ECHO is on. 在无限循环中 关于我哪里出错的任何想法Windows命令处理器将在使用命
for /l %%x in (Veronica, Nils, Mike, Tom) do (
set word=%%x
set str="My name is Name"
call set str=%%str:Name=%word%%%
echo %str% >> names.txt
)
不幸的是,唯一的输出是:
ECHO is on.
ECHO is on.
ECHO is on.
在无限循环中
关于我哪里出错的任何想法Windows命令处理器将在使用命令块执行命令之前,在命令块内以
(
开始,以匹配)
结束的引用环境变量的当前值替换所有出现的%variable%
。查看此命令块通过cmd.exe处理可以通过在命令提示符窗口中运行批处理文件来查看,而不是双击批处理文件,将@echo off
删除或修改为@echo on
或暂时注释掉,直到批处理文件按预期工作
在命令提示窗口中运行set/?
时的帮助输出在IF和FOR示例中解释了在同一命令块中定义或修改的命令块内访问环境变量值的首选方法是何时和如何使用
另一种解决方案是使用语法%%variable%%
引用环境变量,并使用commandCALL通过cmd.exe
强制对此命令行进行双重解析。在这种情况下,%%
在将整个命令块解析为引用的环境变量两侧的%%
时被修改,随后在执行命令调用时,再次解析剩余的%变量%
,并用引用变量的当前值替换
在已发布的批处理代码中,环境变量str
未在上面为带有命令块的命令行定义。由于这个原因,echo%str%>>names.txt
正在解析整个命令块,该命令块在执行For之前被cmd.exe
修改为echo>>names.txt
,因此echo只输出当前状态的三倍
另外,命令行调用集str=%%str:Name=%word%%
不起作用,因为word
之前没有为带有命令块的命令行定义word
,因此%word%
已被零替换,导致命令行调用集str=%Name=%
最终被替换循环执行时执行三次
下一个错误是对该循环使用FOR选项/L
。在命令提示窗口中运行for/?
时的帮助输出解释了for/L
:
阅读本帮助后,应该清楚地知道,/L
不是此任务的正确选项
下一个错误是,在解析命令行时,使用commandSET或直接使用cmd.exe
进行的字符串替换始终不区分大小写。分配给环境变量str
的字符串包含name
和name
,它们都在字符串替换时被替换。这不是这里真正需要的
然后使用set variable=“value”
或使用set“variable=value”
会有很大的不同。后一种方法更好,详细解释如下:
最后,重定向操作符>>
留下的空格字符也通过命令ECHO输出,从而在文件中产生一个尾随空格。因此,重定向操作符>
不应与要写入文件的字符串之间用空格分隔
示例的第一个工作代码使用延迟环境变量展开:
@echo off
setlocal EnableExtensions EnableDelayedExpansion
del names.txt 2>nul
set "str=My name is #name#"
for %%I in (Veronica, Nils, Mike, Tom) do echo !str:#name#=%%~I!>>names.txt
endlocal
set "str=My name is $Name"
(for %%x in ("Veronica", "Nils", "Mike", "Tom") do call echo %%str:$Name=%%~x%%)>"names.txt"
set "str=My name is $Name"
setlocal EnableDelayedExpansion
(for %%x in ("Veronica", "Nils", "Mike", "Tom") do echo !str:$Name=%%~x!)>"names.txt"
endlocal
示例的第二个工作代码使用调用技巧:
@echo off
del names.txt 2>nul
set "str=My name is #name#"
for %%I in (Veronica, Nils, Mike, Tom) do call echo %%str:#name#=%%~I%%>>names.txt
要了解所使用的命令及其工作方式,请打开命令提示符窗口,在其中执行以下命令,并非常仔细地阅读为每个命令显示的所有帮助页面
呼叫/?
del/?
echo/?
endlocal/?
获取/?
setlocal/?
设置/?
另请参阅Microsoft关于的文章。您可能希望查看delayedexpansion
从cmdline运行setlocal/?
以查看它是如何启用的,以及set/?
以查看其说明:
@echo off
setlocal enabledelayedexpansion
for %%x in (Veronica, Nils, Mike, Tom) do (
set "word=%%x"
set "str=My name is repl"
call set "str=%%str:repl=!word!%%"
echo !str!
)
为了使脚本看起来更清晰,您甚至可能希望通过调用变量将名称添加到可以更新的变量中,而无需扩展for循环:
@echo off
set "names=Veronica,Nils,Mike,Tom"
setlocal enabledelayedexpansion
for %%x in (%names%) do (
set "word=%%x"
set "str=My name is repl"
call set "str=%%str:repl=!word!%%"
echo !str!
)
请注意,我们将%
替换为代码>我们需要展开变量的地方。也不是说我在每个集合中的变量名前面设置了双引号
错误:
- (start,step,end)
语法中/L%var的用于迭代从start
到end
的数字序列,递增step
指定的数量,因此循环变量(%var
)表示序列中的当前数字。
但是,如果要遍历一组字符串,则必须使用for
命令的裸变量(for
,不带任何开关)。文档中说,它用于迭代一组文件,但只要字符串不包含通配符*?
,它就可以安全地用于迭代一组字符串。
因此,作为更正代码的第一步,必须删除/L
开关FOR
命令:
FOR%%x in(Veronica,Nils,Mike,Tom)do…
正态变量展开;也称为百分比变量扩展,发生在代码实际执行之前,因此在代码块中
set "str=My name is $Name"
(for %%x in ("Veronica", "Nils", "Mike", "Tom") do call echo %%str:$Name=%%~x%%)>"names.txt"
set "str=My name is $Name"
setlocal EnableDelayedExpansion
(for %%x in ("Veronica", "Nils", "Mike", "Tom") do echo !str:$Name=%%~x!)>"names.txt"
endlocal