获取最后修改的文件

时间:2019-04-29 08:43:20

标签: batch-file

我正在处理批处理文件,我想将最后一个文件复制到目录中。在这种情况下,一个.cmd文件始终会生成一个新文件。

我做的第一个尝试是使用/T:W这个东西,它工作得很好。当文件名使用两个(或多个)数字时,就会发生此问题。

for /f %%x in ('dir C:\foldercmd\*.cmd /B /T:W ') do set "cmdFile=%%x"

所以我得到的输出是:

C:\Users\foldercmd>set "cmdFile=cmdWork_1.cmd"
C:\Users\foldercmd>set "cmdFile=cmdWork_10.cmd"
C:\Users\foldercmd>set "cmdFile=cmdWork_11.cmd"
C:\Users\foldercmd>set "cmdFile=cmdWork_12.cmd"
C:\Users\foldercmd>set "cmdFile=cmdWork_2.cmd"
C:\Users\foldercmd>set "cmdFile=cmdWork_3.cmd"
C:\Users\foldercmd>set "cmdFile=cmdWork_4.cmd"
C:\Users\foldercmd>set "cmdFile=cmdWork_5.cmd"
C:\Users\foldercmd>set "cmdFile=cmdWork_6.cmd"
C:\Users\foldercmd>set "cmdFile=cmdWork_7.cmd"
C:\Users\foldercmd>set "cmdFile=cmdWork_8.cmd"
C:\Users\foldercmd>set "cmdFile=cmdWork_9.cmd"

我想得到:

C:\Users\foldercmd>set "cmdFile=cmdWork_1.cmd"
C:\Users\foldercmd>set "cmdFile=cmdWork_2.cmd"
C:\Users\foldercmd>set "cmdFile=cmdWork_3.cmd"
[...]
C:\Users\foldercmd>set "cmdFile=cmdWork_11.cmd"
C:\Users\foldercmd>set "cmdFile=cmdWork_12.cmd"

4 个答案:

答案 0 :(得分:1)

我将仅通过标题回答这个问题。 获取上次修改的文件

@echo off
for /f "delims=" %%i in ('dir "C:\foldercmd\*.cmd" /b /a-d /o-d') do set "cmdfile=%%i" & goto :end
:end
echo %cmdfile%

这将按顺序对文件*.cmd进行排序,首先是最新文件,然后仅将第一个文件设置为最新文件并回显它。将新的.cmd文件添加到该目录后,它将选择新文件。如此简单。

答案 1 :(得分:0)

根据Dir /?/O开关允许您进行排序。如果您要这样做,可以根据上次修改日期使用D,这样您就可以得到:

Dir /OD

这是您要寻找的吗?

答案 2 :(得分:0)

如果您无法修改文件命名过程,并且仍想使用名称进行排序,则可以使用中的

For /F "Delims=" %%A In ('PowerShell -NoP^
 "GCI "C:\foldercmd" -Fi "cmdWork_*.cmd"|Sort{If($_ -Match '(\d+)')"^
 "{[int]$Matches[1]}}|Select -Exp Name"')Do Set "cmdFile=%%A"

上面的示例循环遍历每个文件,依次set依次遍历每个文件,直到最后一个文件,但是如果您只想:仅返回最后一个文件:

For /F "Delims=" %%A In ('PowerShell -NoP^
 "GCI "C:\foldercmd" -Fi "cmdWork_*.cmd"|Sort{If($_ -Match '(\d+)')"^
 "{[int]$Matches[1]}}|Select -Exp Name -L 1"')Do Set "cmdFile=%%A"

答案 3 :(得分:0)

两个纯批处理解决方案,搜索使用的最高数量。

  1. 使用计数循环

    :: Q:\Test\2019\04\29\SO_55899758.cmd
    @Echo off
    for /l %%L in (1,1,100) do if not exist "C:\foldercmd\cmdwork_%%L.cmd" (
        set /a "No=%%L-1"
        goto :Done
    )
    Echo Highest number is greater 100
    Goto :Eof
    :Done
    echo Highest used number is %No%
    pause
    
  2. 在下划线处拆分名称并与前一个进行比较

    :: Q:\Test\2019\04\29\SO_55899758_2.cmd
    @Echo off & Setlocal EnableDelayedExpansion
    set "No=0"
    for /f "tokens=2 delims=_." %%L in ('
        dir /B "C:\foldercmd\cmdwork_*.cmd"
    ') do if %%L gtr !No! set "No=%%L"
    echo Highest used number is %No%
    pause