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
For loop move命令+通配符=奇怪的结果_For Loop_Batch File_Cmd_Wildcard_Move - Fatal编程技术网

For loop move命令+通配符=奇怪的结果

For loop move命令+通配符=奇怪的结果,for-loop,batch-file,cmd,wildcard,move,For Loop,Batch File,Cmd,Wildcard,Move,我今天遇到了一个非常奇怪的问题。我在下面概述了重现该问题的步骤。我也已经为这个问题实施了一个变通方法,我也发布了这个方法,所以我很关心为什么会发生这种情况,为什么我需要使用这个变通方法 ==================== ~复制的步骤~ ==================== 创建一个空文件夹,然后在该文件夹中创建一个空文件_generatefiles.bat。 Inside_Generate Files.bat复制/粘贴下面的代码并保存。 现在执行_generatefiles.bat,

我今天遇到了一个非常奇怪的问题。我在下面概述了重现该问题的步骤。我也已经为这个问题实施了一个变通方法,我也发布了这个方法,所以我很关心为什么会发生这种情况,为什么我需要使用这个变通方法

==================== ~复制的步骤~ ====================

创建一个空文件夹,然后在该文件夹中创建一个空文件_generatefiles.bat。 Inside_Generate Files.bat复制/粘贴下面的代码并保存。 现在执行_generatefiles.bat,它将在文件夹中创建394个文本文件。 现在从该文件夹打开一个命令窗口并运行以下命令。。。 检查2007文件夹,该文件夹现在应包含文件2019-10-31 20.26.32.txt。 但是为什么那个文件会被移到那个文件夹里呢?文件名中任何地方都没有2007*

================== ~z~怪诞~ ==================

在命令窗口仍然打开的情况下,运行以下命令。。。 现在,所有文本文件都被移动到2000-2020年间的多个文件夹中。但它们应该只被移动到两个文件夹2019和2020中,因为文件名只包含move命令用于移动这些文件的两个匹配前缀。我不明白为什么他们被移动到错误的文件夹中

============= ~变通办法~ =============

为了解决这个问题,我在年后添加了一个连字符!年而不是年

move 2007-* 2007\
它不再像以前那样移动文件,而是提供输出。。 存在重复的文件名,或者找不到该文件。 这就是它不使用连字符应该告诉我的

与for循环命令相同

cmd /v:on
for /l %g in (2000,1,2020) do (set year=%g& if exist "!year!-*" if not exist "!year!" mkdir !year! & move !year!-* !year!\)
请注意,只有当所有这些文件都在同一文件夹中时,才会发生这种情况。例如,我将文件夹中的前10个文本文件移动到一个单独的文件夹中,然后我可以在不使用连字符2007*的情况下运行命令,它将正确地将10个文本文件移动到2019文件夹中

有人能解释为什么会发生这种奇怪的行为吗?在我编写的数百个批处理脚本中,这是我第一次遇到这个问题。我已经用这个脚本移动文件很长一段时间了,它总是工作得很好。然而,这是我第一次将它用于一个文件夹中的这么多文件。但是我不知道为什么文件的数量会改变它的行为

检查2007文件夹,该文件夹现在应包含文件2019-10-31 20.26.32.txt。 但是为什么那个文件会被移到那个文件夹里呢?文件名中任何地方都没有2007*

假定您在该卷上启用了短文件名,而2019-10-31 20.26.32.txt的短8.3名称恰好是2007CE~1.txt

令人困惑的是,文件名通配符同时检查长名称和短名称

C:\etc>dir /b 2007*
2019-10-31 20.26.32.txt

C:\etc>dir /x | find "2007"
06/08/2020  08:45 PM                 6 2007CE~1.TXT 2019-10-31 20.26.32.txt
检查2007文件夹,该文件夹现在应包含文件2019-10-31 20.26.32.txt。 但是为什么那个文件会被移到那个文件夹里呢?文件名中任何地方都没有2007*

假定您在该卷上启用了短文件名,而2019-10-31 20.26.32.txt的短8.3名称恰好是2007CE~1.txt

令人困惑的是,文件名通配符同时检查长名称和短名称

C:\etc>dir /b 2007*
2019-10-31 20.26.32.txt

C:\etc>dir /x | find "2007"
06/08/2020  08:45 PM                 6 2007CE~1.TXT 2019-10-31 20.26.32.txt
正如用户在中已经正确指出的,当长文件名和短文件名可用时,将匹配长文件名和短文件名

若要解决该问题,请使用,它仅返回长文件路径/名称,以及:

rem//捕获“where”命令行的输出: 对于/F delims=eol=|%%F in' rem///这将返回一个长文件路径/名称的纯列表:^&^ 设置PATHEXT=^&其中D:\path\to\target:2007*.txt ”“是吗 rem//处理当前迭代的项,只需在此处回显即可: 回显已处理项目的完整路径:%%F 由于where也会涉及到,因此可能会返回不需要的附加项目,因此需要暂时清除。由于for/F在新的命令提示符实例中执行后面的命令行,因此这不会影响批处理文件在其中运行的实例

要递归到子目录中,也可以使用where/rd:\path\To\target 2007*.txt。

正如用户在中正确指出的那样,当长文件名和短文件名可用时,将与长文件名和短文件名匹配

若要解决该问题,请使用,它仅返回长文件路径/名称,以及:

rem//捕获“where”命令行的输出: 对于/F delims=eol=|%%F in' rem///这将返回一个长文件路径/名称的纯列表:^&^ 设置PATHEXT=^&其中D:\path\to\target:2007*.txt ”“是吗 rem//处理当前迭代的项,只需在此处回显即可: 回显已处理项目的完整路径:%%F 由于where也会涉及到,因此可能会返回不需要的附加项目,因此需要暂时清除。因为for/F执行命令行 在新的命令提示符实例中,这不会影响批处理文件在其中运行的实例


要递归到子目录中,也可以使用where/rd:\path\To\target 2007*.txt。

8.3文件名正是问题所在。我最初是从桌面上的一个文件夹进行测试的,该文件夹在该驱动器上启用了8.3文件名。但我刚刚在另一个禁用了8.3文件名的驱动器上进行了测试,现在一切正常。这是令人沮丧的,因为在某一点上,我甚至认为8.3文件名可能是问题所在,但我忽略了它,因为我认为您必须在实际使用8.3文件名之前指定它。但正如您所说,使用通配符将检查长文件名和短文件名。感谢您的回答。8.3文件名正是问题所在。我最初是从桌面上的一个文件夹进行测试的,该文件夹在该驱动器上启用了8.3文件名。但我刚刚在另一个禁用了8.3文件名的驱动器上进行了测试,现在一切正常。这是令人沮丧的,因为在某一点上,我甚至认为8.3文件名可能是问题所在,但我忽略了它,因为我认为您必须在实际使用8.3文件名之前指定它。但正如您所说,使用通配符将检查长文件名和短文件名。谢谢你的回答。
cmd /v:on
for /l %g in (2000,1,2020) do (set year=%g& if exist "!year!-*" if not exist "!year!" mkdir !year! & move !year!-* !year!\)
C:\etc>dir /b 2007*
2019-10-31 20.26.32.txt

C:\etc>dir /x | find "2007"
06/08/2020  08:45 PM                 6 2007CE~1.TXT 2019-10-31 20.26.32.txt