免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: zca7
打印 上一主题 下一主题

我想用perl实现 遍历一个工作目录下所有的exe和bat文件 并且执行 请问如果编写 [复制链接]

论坛徽章:
0
11 [报告]
发表于 2007-01-17 17:18 |只看该作者
原帖由 Namelessxp 于 2007-1-17 17:03 发表
大才小用了,2k以上的,用批处理就可以解决

批处理只能call单个bat 不能同时call多个吧

我再努力努力~

论坛徽章:
0
12 [报告]
发表于 2007-01-17 17:33 |只看该作者
原帖由 zca7 于 2007-1-17 17:18 发表

批处理只能call单个bat 不能同时call多个吧

我再努力努力~


  1. @ECHO OFF
  2. @FOR /F "usebackq eol=. tokens=1,3* delims= " %%i IN (`DIR *.BAT /T:C`)  DO IF EXIST %%k IF NOT "%0" == "%%k" IF NOT "%0.bat" == "%%k" IF NOT "%0.cmd" == "%%k" @START /B %%k
  3. @FOR /F "usebackq eol=. tokens=1,3* delims= " %%i IN (`DIR *.EXE /T:C`)  DO IF EXIST %%k IF NOT "%0" == "%%k" IF NOT "%0.bat" == "%%k" IF NOT "%0.cmd" == "%%k" @START /B %%k
复制代码

论坛徽章:
0
13 [报告]
发表于 2007-01-17 17:41 |只看该作者
深了 我慢慢看看 学学

论坛徽章:
0
14 [报告]
发表于 2007-01-17 18:40 |只看该作者
应该用opendir,readdir先读到目录中所有的文件吧。然后用glob,取.exe .bat文件,
并用system调用执行。。当然是放到循环内。

exec和system调用方式不一样。exec用新进程覆盖当前进程。system则用fork创建一个,然后再调用exec

论坛徽章:
0
15 [报告]
发表于 2007-01-17 18:41 |只看该作者
那如果包含子目录呢?

论坛徽章:
0
16 [报告]
发表于 2007-01-17 18:43 |只看该作者
原帖由 zca7 于 2007-1-17 18:41 发表
那如果包含子目录呢?


递归最方便,批处理就不好处理了

论坛徽章:
0
17 [报告]
发表于 2007-01-17 19:11 |只看该作者
#! c:\perl\bin\perl -w

my $mydir = "d:/1";
opendir (DIR,$mydir);        
readdir (DIR);              
while(<DIR>)              
{                             
        if ($_=~(\s+).(bat));
        {
        $batcname=$2;                 
        system($batcname);
       
        };
           
}              

exit   ;   


是这样嘛 第八句报错 我不太知道

论坛徽章:
0
18 [报告]
发表于 2007-01-17 19:19 |只看该作者
不好意思啊 实在不会 能不能提供一个完整得 我读读啊

论坛徽章:
0
19 [报告]
发表于 2007-01-17 19:40 |只看该作者
我google了一下 Modules: File::Find  然后改了一下 ok了 解决了
贴出来 瞧瞧  (有两句我还没都看懂 hehe~)

#! c:\perl\bin\perl -w

use strict;
use File::Find;

my %directories;
find( \&filehandler, "d:/1" );

for my $filename ( sort keys %directories ) {
    my @dirlist = @{$directories{ $filename } };
    if ( scalar @dirlist => 1 ) {
       # print "$filename\n";
        for ( @dirlist ) {
       #    print  "$_".'/'."$filename\n";
           my $bat = "$_".'/'."$filename\n";
           system ("$bat");
            }
        }   # if
    }   # for

sub filehandler {
    # Check to make sure that it's a file, not a directory
    return unless -f $File::Find::name;

    # Just take the filename, and convert to lowercase
    my $nameonly = lc $_;

    # See if it's a .bat file
    return unless $nameonly =~ m/\.(bat)$/i;

    $directories{ $nameonly } = [] unless defined $directories{ $nameonly };
    push( @{$directories{ $nameonly } }, $File::Find::dir );


不过还有个很关键得问题 我想要这些遍历出来得bat文件一起执行 或者是隔一会顺序执行
但是要按照上面得代码得话 就会等第一个完全执行完了才会执行第二个 请问怎么解决?

[ 本帖最后由 zca7 于 2007-1-17 20:05 编辑 ]

论坛徽章:
0
20 [报告]
发表于 2007-01-17 19:46 |只看该作者
system ("cmd.exe /c $bat");
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP