Windows 什么';将最新文件从一个文件夹移动到另一个文件夹的批处理脚本有什么问题?

Windows 什么';将最新文件从一个文件夹移动到另一个文件夹的批处理脚本有什么问题?,windows,batch-file,for-loop,Windows,Batch File,For Loop,我正在尝试组合一个Windows批处理脚本,将最新的文件移动到另一个目录。以下是我的批处理脚本: 当我运行它时,它会移动文件夹中的每个文件。有趣的是,当我将MOVE命令替换为COPY命令时,脚本只复制一个文件: FOR /F "tokens=*" %%G IN ('dir /b *.*') DO copy %%G C:\Users\jrobinson\Desktop\ & exit /b REM ---------------------------------------^^^^ 为

我正在尝试组合一个Windows批处理脚本,将最新的文件移动到另一个目录。以下是我的批处理脚本:

当我运行它时,它会移动文件夹中的每个文件。有趣的是,当我将MOVE命令替换为COPY命令时,脚本只复制一个文件:

FOR /F "tokens=*" %%G IN ('dir /b *.*') DO copy %%G C:\Users\jrobinson\Desktop\ & exit /b
REM ---------------------------------------^^^^
为什么移动脚本要移动每个文件,而复制脚本只复制一个文件?是否可能是因为我的脚本文件也在该文件夹中,并且由于我的编辑,它是最新的文件

编辑:以下是我的源文件夹的内容:

  • myBatchFile.bat
  • 最新的.txt
  • 最旧的.txt
  • second.txt
在*.txt文件中,最新的.txt文件具有最近修改的日期。在所有的文件中,不管扩展名是什么,myBatchFile.bat都有最近修改的日期,因为我一直在编辑它,试图让它工作

编辑#2:这是运行上述第一个命令后我的命令窗口的屏幕截图。这表明,当我只希望复制最新的文件时,源文件夹中的所有文件都被复制


我会使用
dir/b/o:-d/a:-d*
,因此项目按日期排序(最新的第一个),目录被排除在外。否则,排序顺序不清楚,可能会无意中返回目录,如
(当前)或
(父目录)

我不建议使用
%%G
而是建议使用
“%%~fG”
来提供完整路径,并用双引号括起来。此外,目标路径应包含在
中,以避免出现空格问题

如果文件名以空格开头(我认为在Windows中是有效的),则/F的
应更改为
“delims=“
”<代码>“令牌=*”
将其删除

此外,我在
do
之后的代码周围加上括号
()
(因此可以保证并且很明显,命令
move
exit/b
都是循环上下文的一部分)

所有这些导致了以下代码:

FOR /F "delims=" %%G IN ('dir /b /o:-d /a:-d *.*') DO (move "%%~fG" "C:\Users\jrobinson\Desktop\" & exit /b)
由于首先枚举最新的文件,并且的
正文包含
退出/b
(退出批处理文件),因此仅移动该文件。
如果您需要在此行之后执行其他代码,请将
退出/b
替换为
转到:跳过
(或任何其他有效标签),并在
FOR
命令块后立即声明标签(
:跳过


如果包含此处代码的批处理脚本位于其工作目录中,则移动它(如果它是最新的文件)很可能会导致意外行为。您可以使用
find
将批处理脚本本身过滤掉,如下所示:

FOR /F "delims=" %%G IN ('dir /b /o:-d /a:-d *.* ^| find /v /i "%~nx0"') DO (move "%%~fG" "C:\Users\jrobinson\Desktop\" & exit /b)

%~nx0
其中扩展到此脚本的文件名和扩展名(请参见
调用/?
)。

我不确定我是否相信你说的话。因为当我键入相同的命令时,首先看到的是一个文件,然后是
暂停
命令(或
退出

因此,它总是在第一个文件上执行第一个操作,脚本将停止

使用以下代码查看此5秒gifv::

@echo off

if exist ..\destination-test-folder\nul rd /s /q ..\destination-test-folder
if not exist ..\destination-test-folder\nul md ..\destination-test-folder

copy nul newest.txt>nul
copy nul oldest.txt>nul
copy nul second.txt>nul
dir /b .
pause>nul

echo: &echo For loop command: &echo:
for /f "tokens=*" %%g in ('dir /b "*.*"') do if "%%g" neq "%~nx0" move %%g ..\destination-test-folder>nul & echo pause is stated after each iteration & echo         1 file(s) moved. &pause>nul

echo: &echo list destination:
dir /b "..\destination-test-folder" &echo: &echo list source: &echo: 
dir /b . 

我只是想说声谢谢。人:aschipfl 你是我的英雄

下面是我用来将所有只读文件移动到子文件夹“temp”的命令


我会使用
dir/b/o:-d/a:-d*
,这样您就可以按日期(最新的第一个)对项目进行排序,并排除目录;与
%%G
不同,我建议使用
“%%~fG
来提供完整路径;为了可读性,我在
do
之后的代码周围加上括号
()
(尽管我认为这在操作上没有任何区别)…@aschipfl,您需要尽可能多的努力来编写一个答案,可能会添加一个解释,“您发布的代码对每个文件重复
do
操作,所以您应该在使用
goto
移动文件后退出循环,例如,`.@wOxxOm,重复的“do”不会导致我的第二个命令出现问题,使用复制而不是移动的那个。我的第二个命令只复制一个文件,即使文件夹包含多个文件。@user2023861,对不起,我是瞎子。事实上,这很奇怪,因为您的两个示例都应该在处理第一个文件后退出。@wOxxOm,我按要求提供了一个答案……但这不起作用。它仍然会移动源文件夹中的所有文件,而不仅仅是最新的文件。我发现如果我将
dir
命令中的通配符从
*.
更改为
*.txt
,它将只移动最新的*.txt文件。即使我的源文件夹中有多个*.txt文件,这也是真的。真奇怪!我会设法弄明白的。。。那么您的批处理是源目录中的最新文件?如果你把另一个较新的文件放在那里会怎么样?它能工作吗?它能。我放入了一个较新的文本文件,脚本只复制了该文件。只要脚本文件不是正在移动的最新文件,它看起来就可以工作。可能我要做的是将脚本保存在一个单独的文件夹中。谢谢。
cmd
不会将批处理文件缓冲在内存中执行,我认为这会中断
for
循环;所以你可以1。将批处理文件放在其他位置,或2。将其从编程处理中排除;如果你想选择2,我可以在我的答案中考虑,让我知道哇。对于您的选项#2,这是其他用户在下面发布的关于
%~nx0
的内容吗?我猜这就是文件的变量名?我不知道如何向你证明我不是在编造这个。我不知道为什么会有人编造这个。我拥有的命令只影响一个文件和我拥有的命令影响每个文件之间的唯一区别是前者是一个副本,后者是一个移动。我在问题中发布了一个屏幕截图,显示了所有文件
FOR /F "tokens=*" %G IN ('dir /b *.*') DO @echo  %G & pause
@echo off

if exist ..\destination-test-folder\nul rd /s /q ..\destination-test-folder
if not exist ..\destination-test-folder\nul md ..\destination-test-folder

copy nul newest.txt>nul
copy nul oldest.txt>nul
copy nul second.txt>nul
dir /b .
pause>nul

echo: &echo For loop command: &echo:
for /f "tokens=*" %%g in ('dir /b "*.*"') do if "%%g" neq "%~nx0" move %%g ..\destination-test-folder>nul & echo pause is stated after each iteration & echo         1 file(s) moved. &pause>nul

echo: &echo list destination:
dir /b "..\destination-test-folder" &echo: &echo list source: &echo: 
dir /b . 
md temp
FOR /F "delims=" %%G IN ('dir /b /o:-d /a:R *.*') DO (move "%%~fG" "temp" )