|
发表于 2005-8-31 09:57:40| 字数 2,530| - 中国–陕西–西安 电信
|
显示全部楼层
这个老帖又被顶上来了. 有 ".bat" 同好对下面的语句有兴趣:
dir /a:-d /b |awk "BEGIN{FS=\".\"} !/\.zip/ {printf \"7za a -tzip \042%folderB%\\%%s.zip\042 \042%%s\042\n\", $1, $0}"|cmd
我在这里解释一下这个语句的意思. 希望大家能够看明白.
语句分为 3 部分, 使用管道符号 "|" 分割. 看第一部分:
dir /a:-d /b
执行一下就知道了. 这个命令列出当前目录下的所有文件(目录除外), 并且显示为一列. 比如在 C:\ 执行该命令, 得到如下结果.
C:\Documents and Settings\nicole>cd \
C:\>dir /a:-d /b
a.log
arcldr.exe
arcsetup.exe
AUTOEXEC.BAT
boot.ini
bootmgr
BOOTSECT.BAK
chain0
CONFIG.SYS
CountCyclesWMVDecLog.txt
hiberfile.sys
IO.SYS
MSDOS.SYS
NTDETECT.COM
ntldr
pagefile.sys
peldr
可能大家理解有些困难的就是第二部分.
awk "BEGIN{FS=\".\"} !/\.zip/ {printf \"7za a -tzip \042%folderB%\\%%s.zip\042 \042%%s\042\n\", $1, $0}"
awk 是 unix 下的一个程序. 我这里用到的是 windows 版的.
awk 的具体用法如果感兴趣可以 google 一下.
BEGIN{FS=\".\"}
在最开始时执行一个赋值操作. FS 表示 field separator, 这里把 "." (dot) 作为分隔符(\ 用于转义). 上例中的文件名比如 "a.log", 通过管道传给 awk 之后, awk 会用 "."
作为分隔符, 将 a.log 分为两部分. 第一部分 a 命名为 $1, 第二部分 log 命名为 $2. ($0则指的是这一整行的内容即 a.log)
!/\.zip/ 表示查找包含 .zip 的行, ! 表示非, 即查找不包括 .zip 的行, (\ 用于转义), 这句命令的意思是不处理 .zip 文件
{printf \"7za a -tzip \042%folderB%\\%%s.zip\042 \042%%s\042\n\", $1, $0}
对于从管道来的每一行字符串, 执行这个命令. 其实也就是打印了一个类似于这样的字符串. 为了简单, 我们去掉一些冗余的东西. 比如 %folderB%, 另外, 在 bat 文件里, % 双写也是为了转义, 在命令行里就只需要一个 % 了.
C:\>dir /a:-d /b | awk "BEGIN{FS=\".\"} !/\.zip/ {printf \"7za a -tzip \042%s.zip\042 \042%s\042\n\", $1, $0}"
7za a -tzip "a.zip" "a.log"
7za a -tzip "arcldr.zip" "arcldr.exe"
7za a -tzip "arcsetup.zip" "arcsetup.exe"
7za a -tzip "AUTOEXEC.zip" "AUTOEXEC.BAT"
7za a -tzip "boot.zip" "boot.ini"
7za a -tzip "bootmgr.zip" "bootmgr"
7za a -tzip "BOOTSECT.zip" "BOOTSECT.BAK"
7za a -tzip "chain0.zip" "chain0"
7za a -tzip "CONFIG.zip" "CONFIG.SYS"
7za a -tzip "CountCyclesWMVDecLog.zip" "CountCyclesWMVDecLog.txt"
7za a -tzip "hiberfile.zip" "hiberfile.sys"
7za a -tzip "IO.zip" "IO.SYS"
7za a -tzip "MSDOS.zip" "MSDOS.SYS"
7za a -tzip "NTDETECT.zip" "NTDETECT.COM"
7za a -tzip "ntldr.zip" "ntldr"
7za a -tzip "pagefile.zip" "pagefile.sys"
7za a -tzip "peldr.zip" "peldr"
其实这里输出的就是 7za 的压缩文件的命令.
printf 的语法和 c 里面的差不多. %s 表示字符串. 前面解释过, $1 即 "." 前面的部分, 也就是文件名(不包括扩展名). $0 则是完整的文件名.
至于 \042, 042 是引号的八进制 ASCII 码. 这里为了输出这个引号, 用了比较迂回的方法. 因为转义转来转去已经没办法用 \" 来让 awk 输出引号了.
注意, 如果这里不用引号把文件名括起来, 将不能处理文件名中有空格的情况.
|cmd, 这就很简单的, 把刚才产生的命令用管道传给一个 cmd, 也就是让它来执行这些命令.
上面就是这个命令的详解. That's all. thx. |
|