Board logo

标题: [文件操作] 批处理如何将多个文件的文件名、大小、最后修改日期和时间写入指定的新文件? [打印本页]

作者: tousyo88    时间: 2012-4-18 14:55     标题: 批处理如何将多个文件的文件名、大小、最后修改日期和时间写入指定的新文件?

本帖最后由 pcl_test 于 2016-12-14 21:59 编辑

具体要求:
一个目录下有若干文件,将每个文件的文件名、大小、日期、时间写入一个新指定的文件,文件名为“列表文件.txt”
其中每行一个文件,文件名、大小、日期、时间之间以"|"分隔

谢谢!
作者: neorobin    时间: 2012-4-18 16:29

将以下代码保存的 批处理文件放在 szt 所属的父目录中
  1. @echo off & setlocal enabledelayedexpansion
  2. REM 备份原始日期时间格式
  3. for /f "tokens=2*" %%a in ('reg query "HKCU\Control Panel\International" /v sShortDate^|find/i"sSh"') do set "sShortDate=%%~b"
  4. for /f "tokens=2*" %%a in ('reg query "HKCU\Control Panel\International" /v sTimeFormat^|find/i"sTi"') do set "sTimeFormat=%%~b"
  5. REM 修改日期时间格式
  6. >nul reg add "HKCU\Control Panel\International" /v sShortDate /t REG_SZ /d "yyyyMMdd" /f
  7. >nul reg add "HKCU\Control Panel\International" /v sTimeFormat /t REG_SZ /d "HH:mm:ss" /f
  8. set "timeField=C"
  9. set /p "timeField=请选择时间类型, 默认=!timeField! (C 创建时间; A 上次访问时间; W 上次写入的时间):"
  10. if exist "%~dp0szt\列表文件.txt" del /f /q "%~dp0szt\列表文件.txt"
  11. > "列表文件.txt" (
  12.   for /f "tokens=1-3*" %%a in (
  13.     'dir szt /a-d /od /t!timeField! /-c^|findstr "^[1-9].*[0-9][0-9]:[0-9][0-9]"') do (
  14.     <nul set /p "=%%d|%%c|%%a|%%b"
  15. ) )
  16. move "列表文件.txt" "%~dp0szt\"
  17. start "" "%~dp0szt\列表文件.txt"
  18. REM 还原原始日期时间格式
  19. >nul reg add "HKCU\Control Panel\International" /v sShortDate /t REG_SZ /d "!sShortDate!" /f
  20. >nul reg add "HKCU\Control Panel\International" /v sTimeFormat /t REG_SZ /d "!sTimeFormat!" /f
复制代码

作者: tousyo88    时间: 2012-4-18 22:30

回复 2# neorobin


    非常感谢!
我已运行过你提供的代码,基本可以满足要求,但还有2点没达到目标
1. 时间格式要精确到秒,比如21:18:03
2.生成的"文件列表.txt"文件中,每个文件信息一行,你提供的代码没有换行
如能改进以上2点感激不尽!
作者: neorobin    时间: 2012-4-19 00:44

回复 3# tousyo88

17 行改为
  1. echo,%%d^|%%c^|%%a^|%%b
复制代码
即可换行输出

文件时间的秒域输出, 未找到不利用工具或其它脚本的方法.
作者: gawk    时间: 2012-4-19 05:46

回复 3# tousyo88


    WMIC可以精确到秒
作者: neorobin    时间: 2012-4-19 09:47

谢谢 5 楼 gawk 提醒了我 wmic, 改了下
  1. @echo off & setlocal enabledelayedexpansion
  2. set "fn=列表文件.txt"
  3. set "fdir=szt"
  4. REM 备份原始日期时间格式
  5. for /f "tokens=2*" %%a in ('reg query "HKCU\Control Panel\International" /v sShortDate^|find/i"sSh"') do set "sShortDate=%%~b"
  6. for /f "tokens=2*" %%a in ('reg query "HKCU\Control Panel\International" /v sTimeFormat^|find/i"sTi"') do set "sTimeFormat=%%~b"
  7. REM 修改日期时间格式
  8. >nul reg add "HKCU\Control Panel\International" /v sShortDate /t REG_SZ /d "yyyyMMdd" /f
  9. >nul reg add "HKCU\Control Panel\International" /v sTimeFormat /t REG_SZ /d "HH:mm:ss" /f
  10. set "timeField=C"
  11. set /p "timeField=请选择时间类型, 默认=!timeField! (C 创建时间; A 上次访问时间; W 上次写入的时间):"
  12. for %%a in ("C CreationDate" "A LastAccessed" "W LastModified"
  13.   ) do for /f "tokens=1-2" %%b in ("%%~a") do if /i %%b==!timeField! set "filetime=%%c"
  14. if exist "%~dp0!fdir!\!fn!" del /f /q "%~dp0!fdir!\!fn!"
  15. > "!fn!" (
  16.   for /f "tokens=1-3*" %%a in (
  17.     'dir !fdir! /a-d /od /t!timeField! /-c^|findstr "^[1-9].*[0-9][0-9]:[0-9][0-9]"') do (
  18.     <nul set /p "=%%d|%%c|%%a|"
  19.     set "pth=%~dp0!fdir!\%%d"
  20.     for /f %%t in ('wmic datafile where name^="!pth:\=\\!" get !filetime! ^| find "."') do (
  21.       set "ft=%%t"
  22.       echo !ft:~8,2!:!ft:~10,2!:!ft:~12,2!
  23. ) ) )
  24. move "!fn!" "%~dp0!fdir!\"
  25. start "" "%~dp0!fdir!\!fn!"
  26. REM 还原原始日期时间格式
  27. >nul reg add "HKCU\Control Panel\International" /v sShortDate /t REG_SZ /d "!sShortDate!" /f
  28. >nul reg add "HKCU\Control Panel\International" /v sTimeFormat /t REG_SZ /d "!sTimeFormat!" /f
  29. exit
复制代码

作者: tousyo88    时间: 2012-4-19 14:14

回复 6# neorobin


    再次感谢,修改后的代码已看到,待我试验后给你回复!
作者: tousyo88    时间: 2012-4-19 21:45

回复 6# neorobin


  今晚工作用你第一次提供的代码,时间用HH:mm可以通过,但文件目录如果是中文字符,则产生的“列表文件”是空的。而工作必须使用中文目录名。如果这个问题能解决就OK了。(第二段代码暂未试验)
  谢谢!
作者: fatcat    时间: 2012-4-19 22:40

回复 8# tousyo88

2 楼的代码是没有将工作目录变量化的, 你把其中所有的 szt 都替换成你现在用的工作目录名(无论中英文)再看下;

6 楼的代码已经将工作目录变量化了, 你只需改动代码中一个地方就可以了.
作者: tousyo88    时间: 2012-4-20 06:15

回复 9# fatcat


    你说的两者区别我知道,但2楼的代码确实对中文目录名不起作用,我已试验过。
作者: fatcat    时间: 2012-4-20 06:49

本帖最后由 fatcat 于 2012-4-20 06:51 编辑

回复 10# tousyo88

将 6 楼 22 行改为
  1.     'dir "!fdir!" /a-d /od /t!timeField! /-c^|findstr "^[1-9].*[0-9][0-9]:[0-9][0-9]"') do (
复制代码
之前没有用双引号, 导致不支持目录名含空格的情形;
2 楼代码在 16 行也是需做出同样方式的修改
如果仍有问题, 请贴出你测试的目录名
作者: tousyo88    时间: 2012-4-20 13:31

回复 11# fatcat


  谢谢回复,等会我把测试目录压缩上传。
  另外,请帮我看一下下面的代码有什么问题,运行后没有结果。
  1. set file=^%%~ti^
  2. set date_val=%date:~0,4%%date:~5,2%%date:~8,2%
  3. set time_val=%time:~0,8%
  4. @echo on
  5. for /f "delims= " %%i in ('dir /x/b/a-d/oN D:\szt') do (echo %%~ni^|^%%~zi^|^%date_val%^|^%time_val%  )
  6. pause
复制代码
 
作者: fatcat    时间: 2012-4-20 14:28

本帖最后由 fatcat 于 2012-4-20 14:30 编辑

回复 12# tousyo88
  1. @echo off & setlocal enabledelayedexpansion
  2. REM 备份原始日期时间格式
  3. for /f "tokens=2*" %%a in ('reg query "HKCU\Control Panel\International" /v sShortDate^|find/i"sSh"') do set "sShortDate=%%~b"
  4. for /f "tokens=2*" %%a in ('reg query "HKCU\Control Panel\International" /v sTimeFormat^|find/i"sTi"') do set "sTimeFormat=%%~b"
  5. REM 修改日期时间格式
  6. >nul reg add "HKCU\Control Panel\International" /v sShortDate /t REG_SZ /d "yyyyMMdd" /f
  7. >nul reg add "HKCU\Control Panel\International" /v sTimeFormat /t REG_SZ /d "HH:mm:ss" /f
  8. set "dttm=!date!|!time:~0,8!"
  9. cd /d "d:\szt"
  10. for /f "delims=" %%i in ('dir /x/b/a-d/on') do echo %%~nxi^|%%~zi^|!dttm!
  11. REM 还原原始日期时间格式
  12. >nul reg add "HKCU\Control Panel\International" /v sShortDate /t REG_SZ /d "!sShortDate!" /f
  13. >nul reg add "HKCU\Control Panel\International" /v sTimeFormat /t REG_SZ /d "!sTimeFormat!" /f
  14. pause
  15. exit
复制代码
用 date, time 这两个环境变量获取的是当前的系统日期和时间, 不是文件相关的日期时间
要想 %%~zi 能成功扩展, 2 种方式可选: 1. 工作目录先行设置为 "d:\szt"; 2. 用 dir 的 /s 参数显示文件的全路径, 但若有子目录, 也会把文件列出.
^| 是避免 | 成为 管道, 转义只需在左边加上 ^
作者: neorobin    时间: 2012-4-20 15:14

本帖最后由 neorobin 于 2012-4-20 15:32 编辑

回复 12# tousyo88
WinXP CHS 32 位环境下
%%~ti 的方式也是不能输出 秒 的

下面仍使用 wmic datafile, 不受日期时间格式影响, 如果需要特定的排序方式, 可以在 16 行用 dir 适当的参数修改一下
工作目录使用全路径, 批处理文件 可以放在 除 工作目录之内 的任何地方
  1. @echo off & setlocal enabledelayedexpansion
  2. set "fn=列表文件.txt"
  3. set "fdir=d:\szt" & rem 不含引号的工作目录全路径
  4. set "timeField=C"
  5. set /p "timeField=请选择时间类型, 默认=!timeField! (C 创建时间; A 上次访问时间; W 上次写入的时间):"
  6. for %%a in ("C CreationDate" "A LastAccessed" "W LastModified"
  7.   ) do for /f "tokens=1-2" %%b in ("%%~a") do if /i %%b==!timeField! set "filetime=%%c"
  8. cd /d "!fdir!"
  9. if exist "!fn!" del /f /q "!fn!"
  10. if exist "TempWmicBatchFile.bat" del /f /q "TempWmicBatchFile.bat"
  11. <nul > "!temp!\!fn!" (
  12.   for /f "tokens=*" %%a in ('dir /b /a-d') do (
  13.     set "pth=%%~fa"
  14.     set /p "=%%~nxa|%%~za|"
  15.     for /f %%t in ('wmic datafile where name^="!pth:\=\\!" get !filetime! ^| find "."') do (
  16.       set "ft=%%t"
  17.       echo !ft:~0,8!^|!ft:~8,2!:!ft:~10,2!:!ft:~12,2!
  18.     )
  19.   )
  20. )
  21. move "!temp!\!fn!" "!fdir!"
  22. start "" "!fdir!\!fn!"
复制代码

作者: tousyo88    时间: 2012-4-20 15:31

回复 13# fatcat

creat_filelist.bat
  1. @echo off & setlocal enabledelayedexpansion
  2. set date_val=%date:~4,4%%date:~9,2%%date:~12,2%
  3. ::set date_val=%date:~0,4%%date:~5,2%%date:~8,2%
  4. > "d:\%date_val%证券清算文件.txt" (
  5.   for /f "tokens=1-3*" %%a in (
  6.     'dir %1 /a-d /od /tW /-c^|findstr "^[1-9].*[0-9][0-9]:[0-9][0-9]"') do (
  7. REM    <nul set /p "=%%d|%%c|%%a|%%b"
  8. REM  echo,%%d^|%%c^|%%a^|%%b
  9.      echo,%%d^|%%c^|%date_val%^|%%b
  10. ) )
  11. move "d:\%date_val%证券清算文件.txt" "%1"
  12. start "" "%1\%date_val%证券清算文件.txt"
复制代码
test_process_call.bat
  1. @echo off
  2. ::set date_val=%date:~4,4%%date:~9,2%%date:~12,2%
  3. set date_val=%date:~0,4%%date:~5,2%%date:~7,2%
  4. set date_month=%date:~5,2%%date:~7,2%
  5. echo 本程序调用creat_filelist.bat生成深圳通发送列表文件
  6. echo 当前日期为:%date_val% %date_month% 请确认电脑日期正确...如日期不正确请按Ctrl-C退出!!
  7. pause
  8. call D:\ts\creat_filelist.bat D:\中文目录
  9. REM call D:\ts\creat_filelist.bat D:\szt
  10. REM call D:\ts\creat_filelist.bat F:\SZTDE\send\B_BCCB\北京银行\20120419
  11. pause
复制代码
以上2个bat文件主要就是测试中文目录名是否可以得到正确结果。试验结果:
在Windows XP系统下结果正确;但在Windows 2000系统下生成的"证券清算文件.txt"为空。
而我的工作环境要求必须使用Windows 2000,这个问题如何解决?

附件:上述两个批处理及示范目录和文件。
作者: fatcat    时间: 2012-4-20 15:38

回复 15# tousyo88

首先看一下 Win 2000 系统的日期时间格式
  1. echo %date%
  2. echo %time%
复制代码

作者: tousyo88    时间: 2012-4-20 16:05

回复 14# neorobin


    Thanks!
现在困扰我的主要问题已经不是文件时间是否精确到“秒”,经过测试,文件时间精确到“分钟”就可以了。
现在主要是在Windos 2000环境下,如果目录名称含有中文字符(比如:D:\中文目录),则此批处理生成的列表文件是空的。(我的工作要求必须使用Windows 2000)
附件是我的测试代码。将附件解压缩至D盘根目录,运行D:\ts\test_process_call.bat。
作者: tousyo88    时间: 2012-4-20 16:08

回复 16# fatcat


    Windows 2000的时间格式没有问题,分别是2012-04-20 16:07:18
    关键是在Windows 2000环境下,目录名称含有中文字符时生成的列表文件是空的。
作者: fatcat    时间: 2012-4-20 16:23

回复 18# tousyo88

Windows 2000 cmd 下是否能显示 中文, chcp 936 报不报错
作者: tousyo88    时间: 2012-4-20 16:35

回复 19# fatcat


    Windows 2000 cmd环境下能显示中文,cmd和批处理文件中拷贝含中文字符路径名的文件都没问题
 在cmd下执行chcp,执行结果为:活动的代码页:936




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2