我正在尝试构建一个.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
使其仅返回文件,不返回目录。类似于dir
和ls
。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
怎么运行的
关闭命令回显功能可获得较简洁的输出。
@echo off
对批处理文件的本地环境变量进行任意更改。
setlocal
设置一个名为的新局部变量
source
,用于保存源文件夹路径。set source=C:\Users\bingersoll001\Desktop\folder1
与上一行类似,为目标文件夹定义一个新的局部变量。
set dest=C:\Users\bingersoll001\Desktop\folder2
创建一个新的局部变量,其中包含要过滤的文件扩展名。多个扩展名必须用分号 (
;
) 分隔。set exts=*.dat
更改当前工作文件夹。
pushd "%source%"
执行
dir /b /o:d /t:w %exts%
命令,然后解析其输出。/b
参数,dir
命令显示没有标题或摘要的裸文件列表;/o:d
使列表按日期/时间排序(最早的在前)。默认情况下,文件按其最后写入时间排序。"delims="
需要此部分以避免文件路径包含空格字符的问题。for /f "delims=" %%G in ('dir /b /o:d %exts%') do (
将文件移动到目标文件夹。
move /-y "%%~G" "%dest%"
无需处理其他文件;跳转到
:break
标签从而退出for
循环。goto :break
恢复先前的工作文件夹并退出。
popd endlocal & exit /b