Windows CMD中的创建日期

时间:2017-04-30 16:17:38

标签: batch-file filenames

使用Windows批处理,此函数返回文件的创建日期:

:creationDate
set "CompareFile=%~1"
echo !CompareFile!
for /f "skip=5 tokens=1,2,4,5* delims= " %%a in ('dir  /a:-d /o:d /t:c') do (
    if "%%~c" NEQ "bytes" (
        if "%%~d"=="!CompareFile!" ( set "%~2=%%~a %%~b" )
    )
)
goto:eof

示例用法:

call :creationDate "!MyFile!" MyFileCreationDate
echo !MyFile! was made on !MyFileCreationDate!

函数中的变量:

%%~a = Creation Date
%%~b = Creation Time
%%~d = Filename (error when there is spaces!)

%%~1 = Filename to get the creation date for
%%~2 = Variable to store creation date in

但它不适用于带空格或特殊字符的文件名。在这种情况下,%%〜d可能只包含文件名的前几个字母,或者什么都没有,导致没有值返回到参数2

目标是让它匹配一个文件名w / spaces我已经作为参数1传递给子程序,并将参数2作为参数1的创建日期返回。

2 个答案:

答案 0 :(得分:4)

@ECHO OFF
SETLOCAL ENABLEDELAYEDEXPANSION
SET "sourcedir=."

FOR /f "delims=" %%a IN (
 'dir /b /a-d "%sourcedir%\*.txt" '
 ) DO (
 CALL :creationdate "%sourcedir%\%%a" c crdatetime
 CALL :creationdate "%sourcedir%\%%a" w wrdatetime
 CALL :creationdate "%sourcedir%\%%a" a acdatetime
 ECHO !crdatetime! !wrdatetime! !acdatetime! %%a

)

GOTO :EOF

:creationDate
for /f "skip=5 tokens=1,2 delims= " %%a in (
 'dir  /a:-d /o:d /t:%2 "%~1"') do set "%~3=%%~a %%~b"&goto:eof
goto:eof

虽然我改变了例程的名称。

答案 1 :(得分:1)

  • 为什么不在dir命令中包含文件名?
  • 要排除目录的其他行,您可以将其导入到findstr。
:: Q:\Test\2017-04\30\SO_43708547.cmd
@Echo off&SetLocal EnableExtensions EnableDelayedExpansion

Set "MyFile=%~1"

call :creationDate "!MyFile!" MyFileCreationDate
echo !MyFile! was made on !MyFileCreationDate!

Goto :Eof

:creationDate
for /f "tokens=1-3* delims= " %%a in (
  'dir  /a:-d /o:d /t:c "%~1" ^| findstr /i "%~nx1$" '
) do set "%~2=%%~a %%~b"

goto:eof

示例输出(使用我的用户设置日期格式):

> SO_43708547.cmd "test name.txt"
test name.txt was made on 2017-04-30 18:49

修改更改测试文件以包含空格。