DOS下的BAT批处理操作往往提供一个文件清单,然后对文件清单进行操作,如压缩、FTP/FTPS发送到远端、删除等,如何判断此文件清单的文件是否存在呢?解决此问题就有了此博客。
假如有文件清单filelist.txt如下:
E:\document\code_new
E:\java
E:\picture\11.PNG
E:\picture\12.PNG
E:\picture\notexist.PNG
其中,前四个目录(文件是存在的),最后一个文件不存在,因而笔者故意命名为notexist.
考虑到以下两步可解决此问题:
a) 逐行遍历filelist.txt的内容;
b) 对每一行内容进行判断是否存在。
@echo off
Rem close echo
rem into current path
pushd %~dp0
set FILENAME=filelist.txt
for /f "delims=^" %%i in (%FILENAME%) do (
if exist %%i (
echo %%i
)else (
echo [Warning] %%i is no exist
)
)
popd
pause
a) filelist.txt与脚本文件(假设为checkfile.bat)同级目录,pushd%~dp0表示“保存当前目录以供 POPD 命令使用,然后改到指定的目录”,也就是进入到脚本所在目录(由%~dp0指示);
b) for循环逐行遍历文件内容,将内容保存在变量i中;
c) if函数检查变量i指示的文件(目录)是否存在。存在,则echo文件名;不存在,则echo [warning];
d) popd回到之前pushd之前的目录。
补充:
if的帮助文档中显示有三种用法:
IF [NOT] ERRORLEVEL number command
IF [NOT] string1==string2 command
IF [NOT] EXIST filename command
1. 检查上一条命令执行的结果(errorlevel),然后执行命令;
2. 检查两个字符串是否相等,然后执行命令;
3. 检查文件是否存在,然后执行命令--------本博所用。
关于pushd/popd这对命令Linux也有,在写shell脚本时用处很大,命令就是将目录加入/弹出目录栈,方便快速切换脚本执行的当前目录。
a. 7-zip简介(官网)
7-Zip is afile archiver with a high compression ratio. 7-Zip is freesoftware with open source. The most of the code is under the GNULGPL license. Some parts of the code are under the BSD 3-clause License.Also there is unRAR license restriction for some parts of the code.
翻译:7zip是一款拥有高压缩比的文件打包工具,是一个开源的自由软件。其大多数代码都是基于GNU LGPL开源许可,少量代码基于BSD 3条款许可。然而,也有些代码存在unRAR许可限制。
b. 安装与配置
安装就不说了,直接在官网https://www.7-zip.org/上下载安装即可进行傻瓜式安装。这里要补充的是安装后,7zip提供命令行版本和GUI版本。而我们要在DOS脚本中使用的是命令行版本,是安装目录下的一个叫7z.exe的文件。
配置:为了在cmd窗口的任意路径能找到7z.exe这个文件,我们把7z的安装目录添加到环境变量中,如图所示。这样我们可以在cmd下直接使用7z的命令了。
c. 根据文件清单压缩
有了上面检测文件是否存在的基础,此需求很简单了。但检测到文件存在时,用7z添加到压缩包即可。
d. 代码
@echo off
Rem close echo
rem into current path
pushd %~dp0
set FILENAME=filelist.txt
for /f "delims=^" %%i in (%FILENAME%) do (
if exist %%i (
Rem use 7z
7z a d:\test.zip %%i
)else (
echo [Warning] %%i is no exist
)
)
popd
pause
e. 7zip原始参考资料
7zip最权威最原始的参考资料有两个:
一是官网;二是安装目录有个叫7-zip.chm的文件。
认真看,一切OK。