作者:半点闲
时间:2014-3-29 16:16
博客:blog.csdn.net/cg_i
邮箱:b_dx@sohu.com
参考书籍:《Windows命令行详解手册》
参考资源:《批处理命令 For循环命令详解》 、《Windows Command Shell的批处理参数》
读书笔记:3.5.4 变量作用范围局部化
关键字:Windows命令行详解手册 批处理编程 SETLOCAL PUSHD POPD FOR FINDSTR IF NOT EXIST %1 %~1 %2
前几天,无意中看到此书。这是一本讲解如何通过命令行管理Windows系统的不多见的书籍之一,纯粹从命令行的角度来讲解如何完成复杂的Windows系统管理任务,这样的书籍非常少见。显而易见,有大量关于Windows管理的书籍,也有大量关于Windows脚本设计的书籍。我是从DOS时代时接触计算机的,批处理可以算是我接触到的最早的“编程语言”,随着Windows时代的来临,批处理渐渐淡出我的视野,仅存一些陈旧的批处理记忆也是支离破碎的。此书映入我的眼帘时,感情上让我觉得倍感亲切,正好时间上还算空闲,就静下心来初读了几章,就被Windows命令行之丰富功能之强大唏嘘不已,Windows的每一个新版本都会对命令行做一些扩展与增强,这种持续的更新使得Windows命令行的性能与多功能性都得到了很大的改善。用现今的Windows版本可以使用命令行完成很多以前版本无法完成的任务。满怀着激动的心情,着手编写了一个实验性质的“批处理”脚本,没想自信满满的我,期间也摔了一个不大不小的跟头,让我不敢轻视这门“语言”了。
@echo off
@SETLOCAL
if not "%OS%"=="Windows_NT" goto :eof
REM %~1扩展%1并删除任何引号 ("")。
if "%~1"=="" (set INFO=echo && set SEXIT=1) else (set INFO=REM && set SEXIT=0)
if "%2" neq "" (
if /i "%2"=="/q" (set INFO=REM && set SEXIT=0 && set OPTIONS=1) else (set INFO=echo && set SEXIT=1)
)else (set OPTIONS=0)
%INFO% ***********************************************
%INFO% Script : Clean.bat
%INFO% Creation Date : 3/19/2014
%INFO% Last Modified : ?/??/????
%INFO% Author : 高玉涵
%INFO% E-mail : b_dx@sohu.com
%INFO% Env : CN_WindowsXP_SP3通过
%INFO% ***********************************************
%INFO% Description : 清除文件。
%INFO% -
%INFO% Clean.bat [drive:][path]filename [/Q]
%INFO% -
%INFO% [drive:][path]
%INFO% 访问指定的驱动器、目录下所有子目录,
%INFO% 默认访问当前目录下所有子目录。
%INFO% -
%INFO% filename
%INFO% 指定删除的文件名,不支持通配符。
%INFO% -
%INFO% /Q 安静模式。删除时,不要求确认。
%INFO% "" 双引号圈引带空格的路径。如:
%INFO% Clean.bat "X:\My Documents\test.txt"
%INFO% ***********************************************
%INFO% Files : Stores output in Clean.log(删除日志)
%INFO% ***********************************************
@if "%SEXIT%"=="1" goto :eof
@TITLE "Start Clean..."
CLS
COLOR 07
REM 1.不允许出现通配符
echo %~1|FINDSTR "[*|?]" 1>NUL && echo [1:%~1]不允许使用通配符!&& goto :eof
REM 2.不允许字符串以\号结尾,[\\$(点用于忽略echo在行尾给的换行符)]
echo %~1|FINDSTR /i "\\$" 1>NUL && echo [2:%~1]未指定删除的文件名。 && goto :eof
PUSHD %~1 2>NUL && echo [3:%~1]未指定删除的文件名。&& POPD && goto :eof
set TARGET=%~1
set COUNT=0
set TOTAL=0
for /f "usebackq delims=" %%A in (`dir /a-d /b /s "%TARGET%"`) do (
if exist "%%A" (
@if "%OPTIONS%"=="1" (
DEL /A "%%A"
@if not exist "%%A" (set /a COUNT+=1 && set /a TOTAL+=%%~ZA && echo "%%A" >> Clean.log)
) else (
DEL /P /A "%%A"
@if not exist "%%A" (set /a COUNT+=1 && set /a TOTAL+=%%~ZA && echo "%%A" >> Clean.log)
)
)
)
@ECHO 清除 %COUNT% 个文件 释放 %COUNT% 字节空间
@ENDLOCAL
脚本执行效果:
D:\Downloads>clean.bat "d:\My Documents\Dropbox\Thumbs.db" /q
Clean.bat按受两个参数,至少提供一个参数,如只给出了要清除的文件名,没有给出路径则在当前目录下寻找(含子目录),如路径中包含空格得用“”(双引号)圈起来。第二个参数只能是/Q(或/q),开启表示直接清除目标文件不提示(默认,清除目标文件前逐个让用户确认)。成功,提示清除的文件个数及回收多少空间(单位:字节)。
成功后的提示:
清除 17 个文件 释放 17 字节空间