使用Windows DIR命令按时间戳对文件进行排序

使用Windows DIR命令按时间戳对文件进行排序,windows,sorting,batch-file,timestamp,dir,Windows,Sorting,Batch File,Timestamp,Dir,我想按文件名中定义的时间戳对以下文件进行DIR排序-最早的优先: 时间戳=yyyydmm NAME_20121410.dat NAME_20121509.dat NAME_20121609.dat 结果应该如下所示: NAME_20121509.dat NAME_20121609.dat NAME_20121410.dat 如何使用一行程序实现这一点?由于日期格式很愚蠢,您需要首先拆分文件名并对重新排列的名称进行排序。 不是一行程序,但它在批处理文件中工作 @echo off ( for

我想按文件名中定义的时间戳对以下文件进行DIR排序-最早的优先: 时间戳=yyyydmm

NAME_20121410.dat
NAME_20121509.dat
NAME_20121609.dat
结果应该如下所示:

NAME_20121509.dat
NAME_20121609.dat
NAME_20121410.dat

如何使用一行程序实现这一点?

由于日期格式很愚蠢,您需要首先拆分文件名并对重新排列的名称进行排序。 不是一行程序,但它在批处理文件中工作

@echo off
(
  for %%A in (*_*.dat) do @(
    call set "name=%%A"
    call set "nameDate=%%name:*_=%%"
    call set "Year=%%nameDate:~0,4%%"
    call set "Day=%%nameDate:~4,2%%"
    call set "Month=%%nameDate:~6,2%%"
    call echo %%Year%%%%Month%%%%Day%% %%name%%
  )
) | sort | (
  for /F "tokens=1,*  delims= " %%A in ('more') DO @echo %%B
)

由于日期格式很愚蠢,您需要首先拆分文件名并对重新排列的名称进行排序。 不是一行程序,但它在批处理文件中工作

@echo off
(
  for %%A in (*_*.dat) do @(
    call set "name=%%A"
    call set "nameDate=%%name:*_=%%"
    call set "Year=%%nameDate:~0,4%%"
    call set "Day=%%nameDate:~4,2%%"
    call set "Month=%%nameDate:~6,2%%"
    call echo %%Year%%%%Month%%%%Day%% %%name%%
  )
) | sort | (
  for /F "tokens=1,*  delims= " %%A in ('more') DO @echo %%B
)

如果可以使用PowerShell,请尝试以下操作:

PS II> ls *.dat | sort {$_ -replace '(\d{2})(\d{2})\.*','$2$1'}

如果可以使用PowerShell,请尝试以下操作:

PS II> ls *.dat | sort {$_ -replace '(\d{2})(\d{2})\.*','$2$1'}

@杰布-事实上,我不认为简单的一行是可能的。我相信OP希望基于名称中的日期进行排序,而不是基于上次修改或创建的时间戳。名称中的日期和文件时间戳之间可能没有关联。我想到了dir/O-N,但我重新阅读了这个问题,看到了愚蠢的日期格式YYYY DD MM而不是YYYY MM DD。这样做有点棘手solve@jeb是的,日期格式确实很愚蠢。我将要求该文件的供应商使用更便于排序的格式YYYYMMDD@jeb-事实上,我不认为简单的一行是可能的。我相信OP希望基于名称中的日期进行排序,而不是基于上次修改或创建的时间戳。名称中的日期和文件时间戳之间可能没有关联。我想到了dir/O-N,但我重新阅读了这个问题,看到了愚蠢的日期格式YYYY DD MM而不是YYYY MM DD。这样做有点棘手solve@jeb是的,日期格式确实很愚蠢。我将要求该文件的供应商使用更便于排序的格式YYYYMMDD