Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 使用批处理文件编辑字符串中的单词_Windows_Batch File_Cmd - Fatal编程技术网

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/?
时的帮助输出在IFFOR示例中解释了在同一命令块中定义或修改的命令块内访问环境变量值的首选方法是何时和如何使用

另一种解决方案是使用语法
%%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