这个问题源于猪八戒网上的一个小项目,项目是这样的,使用脚本实现以下功能:
1、文件在U盘中,隐藏在文件夹date里
2、设定好插入U盘自动运行,但如果电脑关闭了U盘自动运行功能,能通过点击U盘中的setup.exe运行
3、能在文件夹date中增设一个以电脑命名名的文件夹,属性隐藏
4、能自动将硬盘中的所有.xls文件copy到U盘的date文件夹下的以电脑名命名的文件夹中,并同时将后缀改名
为.dat,属性为隐藏
5、不能有任何提示,任何可见窗口,纯后天操作,包括文件错误、磁盘满、同名覆盖等
6、按我的文档,桌面,D: ,E ,F,G ,C顺序搜索并copy,任何时候拔出U盘均能不提示信息
7、杀毒软件不能报毒
对于上面的这么多功能,作为一个新人,我是无法用tcl实现的,但是可以将问题简化。于是提出了:
将E盘目录下的,暂时不考虑子目录中的,.tcl文件复制到F盘
对于这个任务,需要解决的问题:
1、如何知道E盘目录中.tcl文件个数和名称
2、知道了名称怎么复制过去。
用到的指令:cd
glob -path
-tails
split llength
while lindex file
copy incr
指令说明:
cd
管理工作目录
在tcl中,一共有两个命令来管理当前工作目录,pwd和cd
。其中pwd和UNIX下的pwd命令完全一样, 没有 参 数,返回当前目录的完整路径。
cd
命令也和UNIX命令也一样,使用一个参数,可以把工作目录改变为参数提供的目录。如果cd
没使用参数,UNIX下,会把工作目录变为启动TCL脚本的用户的工作目录,WINDOWS下会把工作目录变为windows操作系统的安装目录所在的盘的根目录(如:C:/)。值得注意的是,提供给cd的参数中路径中的应该用'/'而不是'\'。如
cd C:/TCL/lib。这是UNIX的风格。
glob 操作文件名
TCL提供了两个命令进行文件名操作:glob和file,用来操作文件或获取文件信息。glob命令采用一种或多种模式作为参数,并返回匹配这个(些)模式的所有文件的列表。file的指令特别多,这里不详细介绍。
-path
-tails glob指令的设置
这个都是glob中的应用,具体不详细讲,在这里就是使得glob返回的内容为文件名。
split
处理字符串
该指令完成字符串到list的转换
llength
该指令返回list中元素的个数
while
流程控制
lindex
该指令从一个list中取得元素
file copy 实现文件的复制
incr
改变变量值,作用为+
代码为:
cd e:/
set f [glob -path e:/ -tails *.tcl]
split $f
set num [ expr {[llength $f] -1} ]
while { $num >= 0 } {
set f_name [lindex $f $num ]
file
copy $f_name f:/$f_name
incr num -1
}
虽然代码很简短,但是有很多点需要注意。
注意点一:
首先第一行是必须的,必须将工作目录修改为E盘,否则无法进行file copy操作
注意点二:
列表元素从0开始,所以元素个数得减一
注意点三:
while语句的第二个{必须与while一行,否则运行会报错
代码解释:
首先将工作目录换为E盘,然后通过glob获得所有.tcl文件列表,在tcl中默认保存为字符串。由于字符串中的文件名无法获知,所以需要将字符串转换为list。这里幸运的是,每个文件名后面都有一个分割字符,这样刚好每个文件名就是list的每个元素。在得到文件名后,用while语句实现多个文件的复制。
结果为:
E盘中的tcl文件为:
http://s2/mw690/0033TwPDzy6R5cO7CWle1&690
F盘复制到的文件为:
http://s3/mw690/0033TwPDzy6R5cRE2oW62&690
虽然这个代码很简单,实验结果也很简单,但是这说明tcl脚本能够实现对文件的搜索和复制功能,这是一个标志性的成功,表明用tcl能够实现上面的项目要求。从而可以实现用U盘盗取别人计算机某种类型文件的功能。想想就很刺激有木有。
加载中,请稍候......