Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.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
Batch file 我可以在循环之后使用循环迭代器吗?_Batch File - Fatal编程技术网

Batch file 我可以在循环之后使用循环迭代器吗?

Batch file 我可以在循环之后使用循环迭代器吗?,batch-file,Batch File,此代码工作正常(将包含“center”的文件复制到c:\temp: dir %1 |FOR /f "tokens=5" %%G IN ('findstr "Center"') DO ( copy %1\%%G c:\temp\ ) 但我想在循环后使用%%G var: echo %%G 但是我看到的是%%G而不是文件名。 为什么?仅仅因为批处理文件语言是这样设计的。实际上,有许多语言不会将循环变量泄漏到循环范围之外(取决于它是如何声明的) 在循环中使用普通变量存储最后一个值: for %%G

此代码工作正常(将包含“center”的文件复制到c:\temp:

dir %1 |FOR /f "tokens=5" %%G IN ('findstr "Center"') DO (
copy %1\%%G c:\temp\
)
但我想在循环后使用%%G var:

echo %%G
但是我看到的是%%G而不是文件名。
为什么?

仅仅因为批处理文件语言是这样设计的。实际上,有许多语言不会将循环变量泄漏到循环范围之外(取决于它是如何声明的)

在循环中使用普通变量存储最后一个值:

for %%G in (something) do (
    set "lastLoopValue=%%G"
)
echo %lastLoopValue%
顺便说一句,您发布的代码可以写在一行中,没有任何循环:
copy%1\*Center*c:\temp\
如果您不介意通配符方法不区分大小写的话

附加说明:代码的固定版本:

@echo off
FOR /f "delims=" %%G IN ('dir %1 /b ^| findstr "Center"') DO (
    copy "%~1\%%G" c:\temp\
    set "lastLoopValue=%%G"
)
echo %lastLoopValue%

可能相关:我不确定你的管道是否可以这样工作;我会这样写:
for/F“tokens=5”%%%G in('dir/B“%%1”^ findstr“Center”)do
…是的,问题中的代码只是被破坏了。顺便说一句,
“%%1”
相当于
%1
%1
可能包含也可能不包含双引号(取决于参数传递到脚本的方式);
%~1
将始终删除周围的双引号;
“%~1”
将始终包含周围的双引号,但避免使用双引号(与
%1
相反)…@aschipfl,是的,这就是我的意思,
%1
没问题。谢谢你的帮助,但它不起作用,输出是“回声关闭”这意味着%lastLoopValue%为空。如果您根据答案运行示例,那么输出当然将为空,因为您的计算机上没有名为
某物的文件。当然不是,我使用了我的代码,文件被复制(在循环内)但是当它出来时,var是空的。@Ariel,请告诉我们你是如何尝试wOxxOm的答案的。@Ariel,你的代码被破坏了,我在答案中添加了一个固定版本。