我是批处理文件的新手,想在文件夹中获取最新创建的某种类型文件的时间戳,并将该时间戳存储在变量中。
到目前为止,这就是我所拥有的:
FOR /f %%i in ('dir /O:D /T:C /b *.csv') DO (set LAST=%%i
goto stop)
:stop
echo Last created file:%LAST%
输出是文件名,但我也需要时间戳。
答案 0 :(得分:0)
尝试一下:
::@echo off
set LAST=
set TimeStamp=
FOR /f "tokens=1,2,4" %%i in ('dir /O:-D /T:C *.csv^|findstr .csv') DO (
set "LAST=%%k"
set "TimeStamp=%%i %%j"
goto stopfor
)
:stopfor
echo Last created file: %LAST%
echo Time Stamp: %TimeStamp%
在-
之前的 D
用于降序。
已删除-b
,因为它将禁止显示时间戳。
然后管道传输到findstr
以仅显示那些文件行。 (忽略摘要)
检查for /?
,dir /?
和findstr /?
以了解更多信息。
另一种方法,无需通过管道传递到findstr
:
::@echo off
set LAST=
set TimeStamp=
FOR /f %%i in ('dir /O:-D /T:C /b *.csv') DO (
set "LAST=%%i"
set "TimeStamp=%%~ti"
goto stopfor
)
:stopfor
echo Last created file: %LAST%
echo Time Stamp: %TimeStamp%
答案 1 :(得分:0)
我已决定将其添加为替代答案,以提供创建的时间戳,包括秒,即yyyy/MM/dd @hh:mm:ss
。
确定文件的方法尚未更改,DIR
,我只是使用WMI命令行实用程序wmic.exe
以与语言环境无关的方式检索日期。
@Echo Off
If Not Exist *.csv Exit/B
For /F Delims^=^= %%A In ('Set _ 2^>Nul')Do Set "%%A="
For /F Delims^=^ EOL^= %%A In ('Dir/B/OD/TC *.csv 2^>Nul'
)Do If /I "%%~xA"==".csv" Set "_F=%__CD__%%%A"
For /F Delims^=^ EOL^= %%A In ('WMIC DataFile Where "Name='%_F:\=\\%'"^
Get CreationDate 2^>Nul')Do For %%B In (%%~nA)Do Set "_C=%%B"
If Not Defined _C Exit /B
Set "_C=%_C:~,4%/%_C:~4,2%/%_C:~6,2% @ %_C:~-6,2%:%_C:~-4,2%.%_C:~-2%"
If Defined _F Echo( Your latest file, %_F%, was created on %_C%&Pause
如果只需要将时间戳记作为变量,则可以使用看起来更简单的方法。
您可以利用批处理文件中的powershell.exe
,还可以实现秒精度:
@For /F "Tokens=*" %%A In ('PowerShell -NoP^
"Ls *.csv|Sort CreationTime|Select CreationTime" 2^>Nul'
)Do @Set "CTS=%%A"
@Set CTS 2>Nul&&Pause
如果当前目录中有大量的csv文件,并且该版本将为您提供一种控制结果的-F
格式的方法,则该版本将是可取的。:>
@For /F "Tokens=*" %%A In ('PowerShell -NoP^
"Ls . -Filt *.csv|Sort CreationTime -Des|Select -F 1 -Exp CreationTime|"^
"Date -F 'yyyy/MM/dd @hh:mm:ss'" 2^>Nul')Do @Set "CTS=%%A"
@Set CTS 2>Nul&&Pause
或者,如果您只想使用cmd.exe
,则可以满意地知道,日期和时间始终显示为DIR
命令的第一和第二个空格分隔的字符串,而您不会需要超过一分钟的准确性,那么我建议您可以使用此方法:
@For /F "EOL= Delims=" %%A In ('Dir/OD/TC *.csv 2^>Nul'
)Do @If /I "%%~xA"==".csv" For /F "Tokens=1-2" %%B In ("%%A"
)Do @Set "CTS=%%B @%%C"
@Set CTS 2>Nul&&Pause