我在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文件中运行这些命令?
答案 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版本的文档来获得确切的语法(或者其他人必须纠正我)。
希望有所帮助!