Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.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 了解(set)说明符的CMD.EXE行为_Windows_Batch File_For Loop_Cmd - Fatal编程技术网

Windows 了解(set)说明符的CMD.EXE行为

Windows 了解(set)说明符的CMD.EXE行为,windows,batch-file,for-loop,cmd,Windows,Batch File,For Loop,Cmd,在Windows 7环境中执行的CMD.EXE批处理文件中有以下命令: FOR %%f IN ("C:\TEMP\FILE.TXT" "C:\TEMP\FILE2.TXT") DO ( ECHO %%f ) C:\TEMP\FILE.TXT不存在 C:\TEMP\FILE2.TXT是否存在 这将产生以下输出: "C:\TEMP\FILE.TXT" "C:\TEMP\FILE2.TXT" 但是,我发现如果我将FOR命令更改为包含通配符,例如?或者*在文件名中,我得到了预期的结果,这只

在Windows 7环境中执行的CMD.EXE批处理文件中有以下命令:

FOR %%f IN ("C:\TEMP\FILE.TXT" "C:\TEMP\FILE2.TXT") DO (
   ECHO %%f
)
  • C:\TEMP\FILE.TXT不存在
  • C:\TEMP\FILE2.TXT是否存在
这将产生以下输出:

"C:\TEMP\FILE.TXT"
"C:\TEMP\FILE2.TXT"
但是,我发现如果我将
FOR
命令更改为包含通配符,例如?或者*在文件名中,我得到了预期的结果,这只是C:\TEMP\FILE2.TXT的回声

即:

产生:
C:\TEMP\file2.txt

for
命令的文档说明:


似乎如果
(set)
说明符中不存在通配符,那么
FOR
命令将文件路径视为字符串文本,并仅对其进行迭代。我是不是误解了文件?在我看来,文件
(set)
说明符中是否存在通配符不应影响行为

你完全理解它

for
命令用于迭代一组不需要是文件或文件夹的元素(更准确地说,它们不需要存在于文件系统中)

但是,当集合中的一个元素包含通配符时,它将被视为对需要解析的文件系统的查询,集合中的元素将被替换为与通配符表达式匹配的文件/文件夹列表

您应该注意,这个查询并不总是静态的。在查询过程中,仅检索第一个匹配的文件/文件夹,但如果文件系统通知有更多的文件/文件夹匹配通配符表达式,则将执行成功的查询以检索其余元素。如果添加/重命名了任何文件并与通配符表达式匹配,则可以将其包括在列表中,也可以不包括(取决于文件系统、命名…)

答:不,无法逃避通配符表达式。当到达集合中的该元素时,集合中的元素中存在
*
将执行文件系统查询

在执行
do
子句中的代码时,如果使用
for
可替换参数修饰符(
%~…
)检索当前引用元素的信息,也将访问文件系统

如果文件/文件夹存在(集合中的元素是有效引用或已通过扩展通配符表达式检索),则会检索请求的信息,但如果文件/文件夹不存在,则会检索请求的信息,具体取决于您可以获取的特定修改器:

  • 如果文件/文件夹存在,正确的/逻辑值应该是什么:驱动器、路径、名称、扩展名、仅包含在元素中的部分,或者,如果缺少,则是从文件系统检索到的信息(假设元素是相对于当前active directory的文件/文件夹引用)

    这一点的一个特例是短名称(
    ~s
    修饰符)。它将返回文件/文件夹引用路径中存在并在文件系统中存储有短名称的目录的短版本,以及不存在或没有短名称的目录的指示字符串文字

  • 空字符串:属性、大小、时间戳、所有需要现有文件/文件夹检索其信息的元素


嗯,文档不完整。这是一个已知的技巧,对于迭代一组任意字符串非常有用。您不显示文件,但显示字符串<代码>在(“你好”“世界”)中为%f执行@ECHO%f。啊,我明白了,司仪已经回答了问题question@Stephan:一个更好的例子:在echo中插入
%~f
修饰符:
FOR%f in(“hello”“world”)DO@echo%~f
我只想补充一点,FOR修饰符也可以在字符串中使用,即使它们不存在于文件系统中。如果给定了特定于文件的修饰符,如
%~T
%~Z
,则不会返回任何值。@Aacini,包括在内。非常感谢。我只是在
集合中思考
部分,我把它删掉了。我喜欢你的编辑!对不起,我只能投一次票<代码>:-)非常感谢您的回答!当我答对时,非静态文件系统查询与我曾经遇到的一个问题相关联——请参见我的问题:…?@aschipfl,谢谢,我错过了这个问题。是的,这是同样的问题。如果你想了解更多信息,可以在
FOR %%f IN ("C:\TEMP\FILE.TXT?" "C:\TEMP\FILE2.TXT?") DO (
 ECHO %%f
)
FOR %variable IN (set) DO command [command-parameters]

%variable  Specifies a single letter replaceable parameter.
(set)      Specifies a set of one or more files.  Wildcards may be used.
command    Specifies the command to carry out for each file.
command-parameters