
工作需要:生成特定文件的文件名、MD5、文件大小、文件修改日期、文件行数信息,以LOG扩展名保存,并将LOG文件的名称命令为与源文件相同。
基础知识
1、基础命令:
rem 关闭回显
@echo off
rem 打开回显
@echo on
rem 暂停并显示“按任意键继续”
pause
2、批处理参数%n的增强用法:
%~1 — 删除引号(“),扩充%1
%~f1 — 将%1扩充到一个完全合格的路径名
%~d1 — 仅将%1扩充到一个驱动器号
%~p1 — 仅将%1扩充到一个路径
%~n1 — 仅将%1扩充到一个文件名
%~x1 — 仅将%1扩充到一个文件扩展名
%~s1 — 扩充的路径指含有短名
%~a1 — 将%1扩充到文件属性
%~t1 — 将%1扩充到文件的日期/时间
%~z1 — 将%1扩充到文件的大小
%~ $PATH: 1 — 查找列在PATH环境变量的目录,并将%1扩充到找到的第一个完全合格的名称。如果环境变量名未被定义,或者没有找到文件,此组合键会扩充到空字符串
注意:以上参数可以组合使用,例如echo %~nx1
命令代表同时扩充源文件的名称和扩展名。
3、输出定向符:
输出定向符用于将命令的输出进行重定向,一般用于将结果写入文件。
其中:
> — 清空现有文件或新建文件,并写入内容;
>> — 新建文件或在现有文件的末尾追加内容。
注意: nul定义为为空设备,>nul
命令用于屏蔽输出内容。
4、延迟变量:
setlocal enabledelayedexpansion — 批处理读取命令时是按行读取的,在处理之前要完成必要的预处理工作,这其中就包括对该行命令中的变量赋值。
例1:
@echo off
set a=1
set a=2&echo %a%
pause
结果:1
例2:
@echo off
setlocal enabledelayedexpansion
set a=1
set a=2&echo %a%
pause
结果:2
解析:
例1中,批处理在运行到set a=2&echo %a%
这条命令时,只是把该条命令做了预处理,而上一条执行完成的命令已经对变量a进行了赋值;
例2中,为了能够感知环境变量的动态变化,启用了变量延迟。意思是在复合语句中,不要将其作为一条语句同时处理(避免预处理),而仍然一条一条地执行。
例3:
@echo off
setlocal enabledelayedexpansion
set str=Test1
if %str%==Test1 (
set str=Test2
echo !str!
echo %str%
)
结果:
Test2
Test1
注意:
对延迟变量的引用为!str!
,对变量的引用为%str%
;
类似if语句中的括号内容被视为一条复合命令。
5、常用命令
FOR %%I in (Command1) do Command2
IF (Condition) (Do Something) ELSE (Do Something Else)
findstr (Text) (源文件)
ren [Drive:][path]〈old filename〉〈new filename〉
这几个命令比较简单,学习下参数就可以掌握,在此不赘述了。
解决问题
1、批处理文件代码
@echo off echo %~nx1>> 1.txt set input=%1 certutil -hashfile %input% MD5>> 1.txt echo %~z1>> 1.txt echo %~t1>> 1.txt SETLOCAL ENABLEDELAYEDEXPANSION SET lines=0 IF "%1" == "" ECHO No Input File! & EXIT /B FOR /F "tokens=* delims=" %%i IN (%1) DO ( SET /A lines=!lines!+1 ) ECHO %lines%>> 1.txt findstr /v "MD5 CertUtil" 1.txt > 2.txt del /q 1.txt ren 2.txt %~n1.log
2、生成的LOG文件内容示例
将要生成LOG信息的文件拖拽到批处理上即可,结果如下:
91230100MA18W00M0Y_DWDKFS_20200831.dat
b95990b98cd2f62075484cbe5aef00d5
52665
2020/09/11 23:52
196