使用 Windows 批处理实用程序根据时间戳一次移动 1 个文件

使用 Windows 批处理实用程序根据时间戳一次移动 1 个文件

我正在尝试构建一个.bat 文件,以基于最旧的时间戳文件将文件从一个文件夹移动到另一个文件夹。

文件夹 1

Filename:        Date Modified:
test1.dat        5/12/2014 4:03pm
test2.dat        5/12/2014 4:04pm

目标是将最旧的文件移至文件夹 2。目前,下面的批处理文件将所有内容从文件夹 1 移动到文件夹 2,显然是因为我没有输入任何与时间相关的代码。

set Delay=10
move /-y "C:\Users\bingersoll001\Desktop\folder1\*.dat" "C:\Users\bingersoll001\Desktop\folder2"
timeout 10 /nobreak
call move.bat

有什么方法可以实现这个吗?

答案1

假设您使用的是相对较新的 Windows 版本(Vista 或更新版本),我建议您使用 PowerShell。在那里执行此类任务要容易得多。如果您愿意,您也可以在 XP 上安装 PS。

gci | where {!$_.PSIsContainer} | sort LastWriteTime | select -f 1 | move -destination "C:\some\path\"

或者如果你有 PS 3.0/Windows 8:

gci -file | sort LastWriteTime | select -f 1 | move -destination "C:\some\path\"

解释:

  • gci- 的缩写Get-ChildItem。它获取目录中的所有文件。-file使其仅返回文件,不返回目录。类似于dirls

  • where- 的缩写Where-Object。根据某些条件过滤输入。在 PS 3.0 之前,-file不存在gci,因此必须使用where过滤器。

  • sort-Sort-Object上升的缩写LastWriteTime

  • select- 的缩写Select-Object。仅取第一个(-f 1)结果。

  • move- 的缩写Move-Item。将前一个管道的结果移动到-destination文件夹中。

help <commandname>命令可获得更多帮助。

答案2

以下批处理脚本将把写入时间最早的文件从原始文件夹移动到目标文件夹。

@echo off
setlocal

set source=C:\Users\bingersoll001\Desktop\folder1
set dest=C:\Users\bingersoll001\Desktop\folder2
set exts=*.dat

pushd "%source%"

for /f "delims=" %%G in ('dir /b /o:d %exts%') do (
move /-y "%%~G" "%dest%"
goto :break
)
:break

popd
endlocal & exit /b

怎么运行的

  1. 关闭命令回显功能可获得较简洁的输出。

    @echo off
    
  2. 对批处理文件的本地环境变量进行任意更改。

    setlocal
    
  3. 设置一个名为的新局部变量source,用于保存源文件夹路径。

    set source=C:\Users\bingersoll001\Desktop\folder1
    
  4. 与上一行类似,为目标文件夹定义一个新的局部变量。

    set dest=C:\Users\bingersoll001\Desktop\folder2
    
  5. 创建一个新的局部变量,其中包含要过滤的文件扩展名。多个扩展名必须用分号 ( ;) 分隔。

    set exts=*.dat
    
  6. 更改当前工作文件夹。

    pushd "%source%"
    
  7. 执行dir /b /o:d /t:w %exts%命令,然后解析其输出。/b参数,dir命令显示没有标题或摘要的裸文件列表;/o:d使列表按日期/时间排序(最早的在前)。默认情况下,文件按其最后写入时间排序。"delims="需要此部分以避免文件路径包含空格字符的问题。

    for /f "delims=" %%G in ('dir /b /o:d %exts%') do (
    
  8. 将文件移动到目标文件夹。

    move /-y "%%~G" "%dest%"
    
  9. 无需处理其他文件;跳转到:break标签从而退出for循环。

    goto :break
    
  10. 恢复先前的工作文件夹并退出。

    popd
    endlocal & exit /b
    

进一步阅读

相关内容