首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Windows 'dir‘命令:指定'/s’时按日期排序文件

Windows 'dir‘命令:指定'/s’时按日期排序文件
EN

Stack Overflow用户
提问于 2018-12-19 05:56:22
回答 3查看 17.8K关注 0票数 3

目标:我想使用批处理文件将具有特定扩展名的最新文件从“源目录”复制到“目标目录”。最新的文件可能在源目录内的几个子目录下。

This question/answer正是我想要的,但是当指定了/s选项(作为this comment would suggest)时,它似乎不能排序:

代码语言:javascript
复制
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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-12-19 08:21:40

如果愿意,您可以从批处理文件中调用Powershell。在较新版本的Powershell上,此代码可以缩短。

代码语言:javascript
复制
for /F "delims=" %%G IN ('powershell "gci -rec | where { ! $_.PSIsContainer } | sort LastWriteTime | select -last 1 | Select-Object fullname"') do set NewestFile=%%G

完整答案:

代码语言:javascript
复制
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"
票数 4
EN

Stack Overflow用户

发布于 2018-12-19 20:20:35

一个简单的解决方案可以是

代码语言:javascript
复制
@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时出现常见问题。当我们引用路径以防止空格出现问题时,我们需要确保路径不会以反斜杠结束,因为反斜杠会转义路径的右引号并使命令失败。

票数 2
EN

Stack Overflow用户

发布于 2018-12-19 07:23:56

一切似乎都运行得很好。我相信您的问题出在原始函数的"delims=|"语句中。通过使用"delims=",它所要做的就是切断循环输出中的第一个|。因为|不会在普通的windows文件路径中,所以完全不需要它。试着在语句中抛出一个"tokens=*"

我还建议使用Set "String="而不是传统的Set String=,因为空格在许多情况下可能是一个问题。我在函数中更新了它。

批处理脚本:

代码语言:javascript
复制
@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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53841679

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档