在perl中执行dos命令

时间:2012-08-03 04:09:51

标签: perl cgi dos

我在cgi文件中有一个简单的perl脚本来查找和替换dos中的文本,例如:

system("type data.txt | powershell -Command "$input | ForEach-Object { $_ -replace \"ID\", \"$id\" }" > new.txt");

system("cat tmp/$id/index.html 's/ID/$id/g' a");

(我有Powershell和Cygwin)

当我运行这个脚本时,什么都没发生! 但是如果我直接在cmd(windows)中输入这个命令,那就完成了! 我的问题是:如何在我的CGI文件中运行这些命令?

2 个答案:

答案 0 :(得分:1)

open(my $fh, "<", "data.txt") or die "Error opening data.txt: $!";
open(my $out, ">", "new.txt") or die "Error opening new.txt: $!";
my $id = 'NewId';
while (<$fh>) {
    s/ID/$id/g;
    print $out $_;
}
close $fh;
close $out;

答案 1 :(得分:0)

通常会发生这种情况,原因是shell和perl环境的环境设置不同。它通常通过使用命令的显式路径名来修复。

所以而不是

system("cat tmp/$id/index.html 's/ID/$id/g' a");

尝试

system("/bin/cat tmp/$id/index.html 's/ID/$id/g' a");

可以在我的机器上运行。从cygwin,您应该能够通过键入which command来找出任何给定命令的路径,用您需要的命令替换command来查找路径。

我不像我在Cygwin那样熟悉Powershell,我也不知道你是否使用了Cygwin perl。可能的情况是,您必须使用unix样式路径来获取命令;如果您使用的是cygwin,则可以使用类似/cygdrive/c/window32/powershellcommand.exe的内容。如果没有,你将不得不寻找你的perl版本的文档来获得确切的语法(或者其他人必须纠正我)。

希望有所帮助!