
脚本编程(语言不限,最好不用编译):实现遍历某个目录所有文件的文件名,将所要查找的信息输出到文本文件
要把结果输出写在一个TXT或者EXCEL中,以便其他程序使用。
最好是脚本语言 编写的,其他静态语言编译好的EXE文件也可以。
高手指教!! 展开
我来写个autoit 脚本吧 (autoit 3.3.6.1 汉化版 winxp home sp3 环境 编译运行通过)
来个效果图
一下是源代码
$dir = "D:\h" ;需要查找的路径
$str = search($dir) ;调用search函数查找路径
$arr = StringSplit($str, "|") ;将search函数返回的字符串拆分成数组,数组元素就是一个文件的完整路径
$file = $arr ;把数组arr复制给file使file成为和arr相同大小的数组,目的只是为了构造相同大小的数组
$j = 1
;循环把 数组arr中
For $i = 1 To $arr[0]
$p = StringInStr($arr[$i], "\", 0, -1) ;从路径尾部向前找到路径分割符"\"在字符串中的位置
$filename = StringMid($arr[$i], $p+1) ;截取文件名
;如果文件名中包含字符串FRA,则将其复制到数组file中
If StringInStr($filename, "FRA", 0) Then
$file[$j] = $arr[$i]
$j += 1
EndIf
Next
$n = $j - 1 ;循环结束后j-1的值就是含FRA的文件的个数
;buf字符串的内容将会用来写入文件
$buf = "总共找到文件个数:" & $n & " 个" &@CRLF
;循环将数组file中的路径拼接到buf上
For $j = 1 To $n
$buf &= $file[$j] & @CRLF
Next
;在脚本所在目录创建统计报告.txt
$fp = FileOpen(@ScriptDir & "\统计报告.txt", 10)
FileWrite($fp, $buf) ;把buf的内容写入统计报告.txt
FileClose($fp) ;关闭fileopen函数打开的文件
Run(@WindowsDir & "\Notepad.exe " & @ScriptDir & "\统计报告.txt", "");用启动记事本打开生成的文件
;递归查找函数,递归查找*.*,支持子目录,以字符串形式返回所有文件的路径
;各路径之间用 竖线“|”隔开
Func search($path)
$ret = ""
$handle = FileFindFirstFile($path & "\*.*")
If $handle = -1 Then Return $ret
While 1
$file = FileFindNextFile($handle)
If @error Then ExitLoop
If @extended Then
$tmp = search($path & "\" & $file)
Else
$tmp = $path & "\" & $file
EndIf
If $tmp <> "" Then
If $ret = "" Then
$ret = $tmp
Else
$ret = $ret & "|" & $tmp
EndIf
EndIf
WEnd
Return $ret
EndFunc
如果需求由一个变成两个或者多个,该如何写?
比如,要查找含有FRA和JPN(或者还有第三、四个目标)的文件名各有多少个,并查找结果按FRA和JPN各自列出结果的路径。
终于改出来啦,可以查找多个关键字
代代码太长 超过字数限制 想要 请要留 e-mail
来个效果图
@echo off
echo 运前之前把我先放到要处理的目录下
pause
for %%i in (*.*) do echo %%i >>tmp_不含子文件夹.txt
pause
for /r %%i in (*.*) do echo %%i >>tmp_含子文件夹.txt
exit
运行结果是把
第一个文本文件把当前目录下文件名分行记录在里面
第二个文本文件把当前目录及所有子目录下文件的绝对路径分行记录在里面
可以把上面代码复制到文件本文件,改扩展名为CMD或BAT ,可或者以另存的方式存为批处理
上面如果要遍历所有子目录里文件太多的话,那执行会有点慢,生成的文本也较大,
如果需求由一个变成两个或者多个,该如何写?
比如,要查找含有FRA和JPN(或者还有第三、四个目标)的文件名各有多少个,并查找结果按FRA和JPN各自列出结果的路径。
处理需要可以是任意有限个,根据你的需要,代码如下
@echo off
echo 运前之前把我先放到要处理的目录下
pause
for %%i in (*FRA*.*,*JPN*.*,*.*) do echo %%i >>tmp_不含子文件夹.txt
pause
for /r %%i in ((*FRA*.*,*JPN*.*,*.*) do echo %%i >>tmp_含子文件夹.txt
exit
如果不需要遍历所有子目录的话,第2句for 语句可以删去
如果不需要在所有文件中搜索的话,可以将for语句括号里最后一逗号和"*.*"删去
找不到文件时,不会有文本生成
my $dir = $ARGV[0];
my $dst = $ARGV[0];
if (!defined $dir){
print "缺少参数!\n";
exit(-1);
}
if (!-d $dir){
print "$dir不是可用的目录\n";
exit(-1);
}
my $content;
if (!opendir DIR,"$dir"){
print "打开目录失败:$dir\n";
eixt(-1);
}
else{
foreach (readdir DIR){
$content .= "$_\n";
}
closedir DIR;
}
if (!open FILE,">$dst"){
print "写文件失败!\n";
exit(-1);
}
else{
print FILE $content;
close FILE;
}
print "succeed!\n";
exit(0);
#程序名:ScanFolder.pl
上面这个是perl脚本,要求你的系统有perl环境(windows下可以装个straberryperl),不需要编译。
运行示例(linux系统):
perl ScanFolder.pl '/home/user/bin/' '/home/user/dst.txt'
第一个参数是你要解析的目录,第二个参数是你要输出的txt文件。这里不能用.xls做目标文件,具体原因可以追问。
谢谢你的回到,我没接触过Perl语言,但我会亲自去试试;
还有,我想借此机会,就此发散一下,看看每种言语都是如何实现的;或者看看谁的方法比较好
或者想继续改进一下,将功能更完善。
但是,貌似很少人关注我的这个问题,至少到现在是这样。
恩,好的
function Show_Text(){
var a = document.getElementById("a")//获取要显示文字的元素
var a_str= document.all ? a.innerText : a.textContent;//判断是IE或FF
a.innerHTML += str_arr[a_str.length];
if(a_str.length==7)clearInterval(Move_Text);}
Move_Text = setInterval(Show_Text,15000);
</script>