我有一个批处理文件来从共享工作区检索文件。
@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
我想将前四个输出列修改为:
提前致歉,如果有更好的流程,也欢迎任何重新设计。
@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 系统(现已删除)