标题: [文件操作] 批处理如何将多个文件的文件名、大小、最后修改日期和时间写入指定的新文件? [打印本页]
作者: tousyo88 时间: 2012-4-18 14:55 标题: 批处理如何将多个文件的文件名、大小、最后修改日期和时间写入指定的新文件?
本帖最后由 pcl_test 于 2016-12-14 21:59 编辑
具体要求:
一个目录下有若干文件,将每个文件的文件名、大小、日期、时间写入一个新指定的文件,文件名为“列表文件.txt”
其中每行一个文件,文件名、大小、日期、时间之间以"|"分隔
谢谢!
作者: neorobin 时间: 2012-4-18 16:29
将以下代码保存的 批处理文件放在 szt 所属的父目录中- @echo off & setlocal enabledelayedexpansion
-
- REM 备份原始日期时间格式
- for /f "tokens=2*" %%a in ('reg query "HKCU\Control Panel\International" /v sShortDate^|find/i"sSh"') do set "sShortDate=%%~b"
- for /f "tokens=2*" %%a in ('reg query "HKCU\Control Panel\International" /v sTimeFormat^|find/i"sTi"') do set "sTimeFormat=%%~b"
-
- REM 修改日期时间格式
- >nul reg add "HKCU\Control Panel\International" /v sShortDate /t REG_SZ /d "yyyyMMdd" /f
- >nul reg add "HKCU\Control Panel\International" /v sTimeFormat /t REG_SZ /d "HH:mm:ss" /f
-
- set "timeField=C"
- set /p "timeField=请选择时间类型, 默认=!timeField! (C 创建时间; A 上次访问时间; W 上次写入的时间):"
- if exist "%~dp0szt\列表文件.txt" del /f /q "%~dp0szt\列表文件.txt"
- > "列表文件.txt" (
- for /f "tokens=1-3*" %%a in (
- 'dir szt /a-d /od /t!timeField! /-c^|findstr "^[1-9].*[0-9][0-9]:[0-9][0-9]"') do (
- <nul set /p "=%%d|%%c|%%a|%%b"
- ) )
- move "列表文件.txt" "%~dp0szt\"
- start "" "%~dp0szt\列表文件.txt"
-
- REM 还原原始日期时间格式
- >nul reg add "HKCU\Control Panel\International" /v sShortDate /t REG_SZ /d "!sShortDate!" /f
- >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 行改为复制代码
即可换行输出
文件时间的秒域输出, 未找到不利用工具或其它脚本的方法.
作者: gawk 时间: 2012-4-19 05:46
回复 3# tousyo88
WMIC可以精确到秒
作者: neorobin 时间: 2012-4-19 09:47
谢谢 5 楼 gawk 提醒了我 wmic, 改了下- @echo off & setlocal enabledelayedexpansion
-
- set "fn=列表文件.txt"
- set "fdir=szt"
-
- REM 备份原始日期时间格式
- for /f "tokens=2*" %%a in ('reg query "HKCU\Control Panel\International" /v sShortDate^|find/i"sSh"') do set "sShortDate=%%~b"
- for /f "tokens=2*" %%a in ('reg query "HKCU\Control Panel\International" /v sTimeFormat^|find/i"sTi"') do set "sTimeFormat=%%~b"
-
- REM 修改日期时间格式
- >nul reg add "HKCU\Control Panel\International" /v sShortDate /t REG_SZ /d "yyyyMMdd" /f
- >nul reg add "HKCU\Control Panel\International" /v sTimeFormat /t REG_SZ /d "HH:mm:ss" /f
-
- set "timeField=C"
- set /p "timeField=请选择时间类型, 默认=!timeField! (C 创建时间; A 上次访问时间; W 上次写入的时间):"
- for %%a in ("C CreationDate" "A LastAccessed" "W LastModified"
- ) do for /f "tokens=1-2" %%b in ("%%~a") do if /i %%b==!timeField! set "filetime=%%c"
-
- if exist "%~dp0!fdir!\!fn!" del /f /q "%~dp0!fdir!\!fn!"
- > "!fn!" (
- for /f "tokens=1-3*" %%a in (
- 'dir !fdir! /a-d /od /t!timeField! /-c^|findstr "^[1-9].*[0-9][0-9]:[0-9][0-9]"') do (
- <nul set /p "=%%d|%%c|%%a|"
- set "pth=%~dp0!fdir!\%%d"
- for /f %%t in ('wmic datafile where name^="!pth:\=\\!" get !filetime! ^| find "."') do (
- set "ft=%%t"
- echo !ft:~8,2!:!ft:~10,2!:!ft:~12,2!
- ) ) )
- move "!fn!" "%~dp0!fdir!\"
- start "" "%~dp0!fdir!\!fn!"
-
- REM 还原原始日期时间格式
- >nul reg add "HKCU\Control Panel\International" /v sShortDate /t REG_SZ /d "!sShortDate!" /f
- >nul reg add "HKCU\Control Panel\International" /v sTimeFormat /t REG_SZ /d "!sTimeFormat!" /f
- 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 行改为- '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
谢谢回复,等会我把测试目录压缩上传。
另外,请帮我看一下下面的代码有什么问题,运行后没有结果。- set file=^%%~ti^
- set date_val=%date:~0,4%%date:~5,2%%date:~8,2%
- set time_val=%time:~0,8%
- @echo on
- for /f "delims= " %%i in ('dir /x/b/a-d/oN D:\szt') do (echo %%~ni^|^%%~zi^|^%date_val%^|^%time_val% )
-
- pause
复制代码
作者: fatcat 时间: 2012-4-20 14:28
本帖最后由 fatcat 于 2012-4-20 14:30 编辑
回复 12# tousyo88 - @echo off & setlocal enabledelayedexpansion
-
- REM 备份原始日期时间格式
- for /f "tokens=2*" %%a in ('reg query "HKCU\Control Panel\International" /v sShortDate^|find/i"sSh"') do set "sShortDate=%%~b"
- for /f "tokens=2*" %%a in ('reg query "HKCU\Control Panel\International" /v sTimeFormat^|find/i"sTi"') do set "sTimeFormat=%%~b"
-
- REM 修改日期时间格式
- >nul reg add "HKCU\Control Panel\International" /v sShortDate /t REG_SZ /d "yyyyMMdd" /f
- >nul reg add "HKCU\Control Panel\International" /v sTimeFormat /t REG_SZ /d "HH:mm:ss" /f
-
- set "dttm=!date!|!time:~0,8!"
-
- cd /d "d:\szt"
- for /f "delims=" %%i in ('dir /x/b/a-d/on') do echo %%~nxi^|%%~zi^|!dttm!
-
- REM 还原原始日期时间格式
- >nul reg add "HKCU\Control Panel\International" /v sShortDate /t REG_SZ /d "!sShortDate!" /f
- >nul reg add "HKCU\Control Panel\International" /v sTimeFormat /t REG_SZ /d "!sTimeFormat!" /f
-
- pause
- 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 适当的参数修改一下
工作目录使用全路径, 批处理文件 可以放在 除 工作目录之内 的任何地方- @echo off & setlocal enabledelayedexpansion
-
- set "fn=列表文件.txt"
- set "fdir=d:\szt" & rem 不含引号的工作目录全路径
-
- set "timeField=C"
- set /p "timeField=请选择时间类型, 默认=!timeField! (C 创建时间; A 上次访问时间; W 上次写入的时间):"
- for %%a in ("C CreationDate" "A LastAccessed" "W LastModified"
- ) do for /f "tokens=1-2" %%b in ("%%~a") do if /i %%b==!timeField! set "filetime=%%c"
-
- cd /d "!fdir!"
- if exist "!fn!" del /f /q "!fn!"
- if exist "TempWmicBatchFile.bat" del /f /q "TempWmicBatchFile.bat"
-
- <nul > "!temp!\!fn!" (
- for /f "tokens=*" %%a in ('dir /b /a-d') do (
- set "pth=%%~fa"
- set /p "=%%~nxa|%%~za|"
- for /f %%t in ('wmic datafile where name^="!pth:\=\\!" get !filetime! ^| find "."') do (
- set "ft=%%t"
- echo !ft:~0,8!^|!ft:~8,2!:!ft:~10,2!:!ft:~12,2!
- )
- )
- )
-
- move "!temp!\!fn!" "!fdir!"
- start "" "!fdir!\!fn!"
复制代码
作者: tousyo88 时间: 2012-4-20 15:31
回复 13# fatcat
creat_filelist.bat- @echo off & setlocal enabledelayedexpansion
-
- set date_val=%date:~4,4%%date:~9,2%%date:~12,2%
- ::set date_val=%date:~0,4%%date:~5,2%%date:~8,2%
-
-
- > "d:\%date_val%证券清算文件.txt" (
- for /f "tokens=1-3*" %%a in (
- 'dir %1 /a-d /od /tW /-c^|findstr "^[1-9].*[0-9][0-9]:[0-9][0-9]"') do (
- REM <nul set /p "=%%d|%%c|%%a|%%b"
- REM echo,%%d^|%%c^|%%a^|%%b
- echo,%%d^|%%c^|%date_val%^|%%b
- ) )
-
- move "d:\%date_val%证券清算文件.txt" "%1"
- start "" "%1\%date_val%证券清算文件.txt"
复制代码
test_process_call.bat- @echo off
-
- ::set date_val=%date:~4,4%%date:~9,2%%date:~12,2%
- set date_val=%date:~0,4%%date:~5,2%%date:~7,2%
- set date_month=%date:~5,2%%date:~7,2%
-
- echo 本程序调用creat_filelist.bat生成深圳通发送列表文件
- echo 当前日期为:%date_val% %date_month% 请确认电脑日期正确...如日期不正确请按Ctrl-C退出!!
- pause
-
- call D:\ts\creat_filelist.bat D:\中文目录
- REM call D:\ts\creat_filelist.bat D:\szt
- REM call D:\ts\creat_filelist.bat F:\SZTDE\send\B_BCCB\北京银行\20120419
- pause
复制代码
以上2个bat文件主要就是测试中文目录名是否可以得到正确结果。试验结果:
在Windows XP系统下结果正确;但在Windows 2000系统下生成的"证券清算文件.txt"为空。
而我的工作环境要求必须使用Windows 2000,这个问题如何解决?
附件:上述两个批处理及示范目录和文件。
作者: fatcat 时间: 2012-4-20 15:38
回复 15# tousyo88
首先看一下 Win 2000 系统的日期时间格式复制代码
作者: 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 |