[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

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

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

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

谢谢!

回复 19# fatcat


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

TOP

回复 18# tousyo88

Windows 2000 cmd 下是否能显示 中文, chcp 936 报不报错

TOP

回复 16# fatcat


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

TOP

回复 14# neorobin


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

TOP

回复 15# tousyo88

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

TOP

回复 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,这个问题如何解决?

附件:上述两个批处理及示范目录和文件。

TOP

本帖最后由 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!"
复制代码

TOP

本帖最后由 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 参数显示文件的全路径, 但若有子目录, 也会把文件列出.
^| 是避免 | 成为 管道, 转义只需在左边加上 ^

TOP

回复 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
复制代码
 

TOP

本帖最后由 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 行也是需做出同样方式的修改
如果仍有问题, 请贴出你测试的目录名

TOP

回复 9# fatcat


    你说的两者区别我知道,但2楼的代码确实对中文目录名不起作用,我已试验过。

TOP

回复 8# tousyo88

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

6 楼的代码已经将工作目录变量化了, 你只需改动代码中一个地方就可以了.

TOP

回复 6# neorobin


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

TOP

回复 6# neorobin


    再次感谢,修改后的代码已看到,待我试验后给你回复!

TOP

返回列表