列出子目录中所有文件的创建时间/日期、修改时间/日期和文件名

问题描述 投票:0回答:1

我有一个批处理文件来从共享工作区检索文件。

@echo off
setlocal
for /f "tokens=*" %%f in ('dir "D:\Share" /a-d-h /b /s') do (
  for /f "tokens=1,2,3" %%g in ('dir "%%f" /tc ^| findstr /C:"%%~nxf"') do (
    echo %%h,%%i,%%g,"%%~nf","%%~xf
    )
  )>>D:\test.csv
endlocal

我想将前四个输出列修改为:

  • 创建时间 HH:MM
  • 创建日期 YYYY-MM.DD
  • 最后修改 HH:MM 最后
  • 修改后的 YYYY-MM.DD

提前致歉,如果有更好的流程,也欢迎任何重新设计。

batch-file cmd directory
1个回答
0
投票
@ECHO OFF
SETLOCAL
FOR /f  "delims=" %%b IN ('dir /b /s /a-d-h "xx.csv" ') DO (
 ECHO %%b
 FOR /f "tokens=1-3" %%g IN ('dir /tc "%%b"^|findstr /c:"%%~nxb"') DO (
  CALL :report %%g %%h %%i %%~tb "%%~nb" "%%~xb"
rem  CALL :report 04/30/2016 08:46 AM 08/05/2016 01:17 PM "%%~nb" "%%~xb"
 )
)

GOTO :EOF

:report
rem parameters are cdate ctime campm mdate mtime mampm name extension (cdate=createdate...)
rem datestamp format is 08/05/2016 01:17 PM for Aug. 5th 2016 @ 1:17pm
rem required output format
rem Time Created HH:MM Date Created YYYY-MM.DD Last Modified HH:MM Last Modified YYYY-MM.DD name extension

CALL :YYYY-MM.DD cdate %1
CALL :24hr ctime %2 %3
CALL :YYYY-MM.DD mdate %4
CALL :24hr mtime %5 %6

ECHO %ctime% %cdate% %mtime% %mdate% %~7 %~8
GOTO :eof

:: convert from mm/dd/yyyy to YYYY-MM.dd

:YYYY-MM.DD 
SET "raw=%2"
SET "%1=%raw:~-4%-%raw:~0,2%.%raw:~3,2%"
GOTO :eof

:: convert from hh:mm ampm to HH:MM

:24hr
SET "raw=%2"
rem Exx 00:17 -> 12:17; 01:17 -> 01:17; 12:17 -> 12:17; 13:17 -> 01:17
IF "%raw:~02%"=="12" (SET /a raw=100) ELSE (SET "raw=1%raw:~0,2%")
rem Exx 00:17 -> 100  ; 01:17 -> 101  ; 12:17 -> 100  ; 13:17 -> 101
IF /i "%3" == "PM" SET /a raw+=12
rem Exx 00:17 -> 100  ; 01:17 -> 101  ; 12:17 -> 112  ; 13:17 -> 113
SET "raw=%raw%%2"
rem Exx 00:17 -> 10012:17; 01:17 -> 10101:17; 12:17 -> 11212:17; 13:17 -> 11312:17
SET "%1=%raw:~1,2%%raw:~-3%"
GOTO :eof

出于测试目的,我针对单个文件并删除了附加到报告文件的内容。

:report
子例程有 8 个参数 - 两组 [date time ampm] 以及文件名和扩展名。名称和扩展名可能包含空格,因此应该用引号引起来。

它使用子程序将提供的日期转换为所需的格式

:YYYY-MM.DD
很简单。它将作为第二个参数提供的日期分配给一个临时变量,然后使用子字符串将所需的字符串传递给指定为第一个参数的变量。
Substringing 由 
:24hr

从提示或 SO 上的许多文章中介绍。重要的是要注意字符串中的第一个字符是字符

echo

,而不是
:YYYY-MM.DD

.

您不应该使用 
set /?
0
 作为用户变量,因为这两个变量都包含用于存储临时文件的目录的名称。在早期,有些人为此目的使用
1

和其他人

temp

,因此设置两者都适合两个群体并保持兼容性。
tmp
有点复杂。 
tmp
 再次用于指定返回变量名称。它的 schtick 是将 
temp

作为小时数转换为

:24hr

 如果时间是上午,则将其保留为 
%1
 对于下午。其他时间下午加12
这里的陷阱是,如果留给自己的设备,批处理将抑制前导零并将前导
12
视为将值指定为
八进制

所以 - 如果时间的前 2 个字符是

00

,则以 
12 开头,否则,以 0

开头(因此,09:xx 将变为

12

- 有效的小数而不是 
100
 - 无效的八进制)。
如果时间是下午就加12
将原来的时间字段附加到结果中,并选择第2个和第3个字符与最后3个返回%1。
由于我的日期/时间格式是 DD/MM/YYYY HH:MM,因此在 
1

例程处理时会产生无意义,所以我使用一组常量进行测试,因为我相信它们会显示在 MM/DD 上/YYYY hh:mm ampm 系统(现已删除)

© www.soinside.com 2019 - 2024. All rights reserved.