批处理:生成特定文件信息

工作需要:生成特定文件的文件名、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

订阅
提醒
0 评论
内嵌讨论
查看全部讨论