目标:我想使用批处理文件将具有特定扩展名的最新文件从“源目录”复制到“目标目录”。最新的文件可能在源目录内的几个子目录下。
This question/answer正是我想要的,但是当指定了/s
选项(作为this comment would suggest)时,它似乎不能排序:
FOR /F "delims=|" %%I IN ('DIR "K:\path\tp\source\dir\*.ext" /B /S /O:D') DO SET NewestFile=%%I
copy "%NewestFile%" "C:\path\to\destination\dir"
您可以单独测试DIR "K:\path\tp\source\dir\*.ext" /B /S /O:D
,以查看它是否不排序。
我尝试过的方法:这个命令本身确实有效:DIR "K:\path\tp\source\dir\*.ext" /S /B | sort
,但是我不知道如何在循环中使用它(批处理文件在我可以确定错误之前就已经存在了--即使最后有一个pause
)。
有什么想法吗?
请参阅:dir docs
发布于 2018-12-19 08:21:40
如果愿意,您可以从批处理文件中调用Powershell
。在较新版本的Powershell
上,此代码可以缩短。
for /F "delims=" %%G IN ('powershell "gci -rec | where { ! $_.PSIsContainer } | sort LastWriteTime | select -last 1 | Select-Object fullname"') do set NewestFile=%%G
完整答案:
cd /d "K:\path\to\source\dir"
for /F "delims=" %%G IN ('powershell "gci -rec *.ext | where { ! $_.PSIsContainer } | sort LastWriteTime | select -last 1 | Select-Object fullname"') do set NewestFile=%%G
copy "%NewestFile%" "C:\path\to\dest\dir"
发布于 2018-12-19 20:20:35
一个简单的解决方案可以是
@echo off
setlocal enableextensions disabledelayedexpansion
set "root=K:\path\tp\source\dir"
set "mask=*.ext"
for %%r in ("%root%\.") do for /f "tokens=2,*" %%a in ('
robocopy "%%~fr" "%%~fr" "%mask%" /njh /njs /nc /ns /ts /s /ndl /nocopy /is /r:0 /w:0 /l
^| sort /r
^| cmd /v /e /c"(set /p .=&echo(!.!)"
') do set "lastFile=%%b"
echo Last file : "%lastFile%"
这段代码使用robocopy
生成带有时间戳前缀的文件列表(开关只请求无作业头、无作业摘要、无文件类、无文件大小、时间戳、递归、无目录列表、无目录信息复制、包含相同文件、无重试、无等待、不复制仅生成列表)。
该时间戳前缀列表(UTF、yyyy/mm/dd hh:mm:ss
、最后一次文件写入)然后按相反顺序排序,以获得第一行中的最后一个文件。这一行是用一个单独的cmd
实例检索的(这避免了for /f
读取长长的数据列表时的时间问题),因此for /f
只读取一行。
由于robocopy
行包含日期、时间和文件名,为了检索最后一个字段,我们请求for /f
检索两个标记:一个包含小时(将存储在%%a
中)和行尾之前的其余文本(存储在%%b
中)
包含额外的for %%r
只是为了防止在使用robocopy
时出现常见问题。当我们引用路径以防止空格出现问题时,我们需要确保路径不会以反斜杠结束,因为反斜杠会转义路径的右引号并使命令失败。
发布于 2018-12-19 07:23:56
一切似乎都运行得很好。我相信您的问题出在原始函数的"delims=|"
语句中。通过使用"delims="
,它所要做的就是切断循环输出中的第一个|
。因为|
不会在普通的windows文件路径中,所以完全不需要它。试着在语句中抛出一个"tokens=*"
。
我还建议使用Set "String="
而不是传统的Set String=
,因为空格在许多情况下可能是一个问题。我在函数中更新了它。
批处理脚本:
@ECHO OFF
Rem | Configuration
Set "MainDirectory=C:\Folder1"
Set "FileExtension=*.txt"
Set "CopyDestination=C:\Folder2"
Rem | Search for the newest file in a directory/sub-directory
for /f "tokens=*" %%A in ('DIR "%MainDirectory%\%FileExtension%" /B /S /O:D') do (SET "NewestFile=%%A")
Rem | Copy file to a destination
copy "%NewestFile%" "%CopyDestination%"
goto :EOF
https://stackoverflow.com/questions/53841679
复制相似问题