Spawn Perl脚本作为具有特定名称的进程

时间:2012-04-03 12:57:11

标签: windows perl exec

我需要一个Perl脚本来使用任意名称生成自己,即使其余的OS 将其视为例如“aaa.exe”。我觉得这可以用Perl做,但现在我不确定。

我在Windows 7 amd64上使用Strawberry Perl 5.14,32位版本。

这是我尝试过但不起作用的内容:

#!perl -w
# spawnself.pl

if ($ARGV[0]) {
    my $name = ($ARGV[0]);
    system {"perl"} $name, $0;
} else {
    print "running as $^X, PID is $$\n";
    print "press Enter to quit...\n";
    my $trash = <>;
}

我根据exec perldoc page(系统页面链接)中的示例编写了这个:exec {'/bin/csh'} '-sh';,其中,IIUC,目标是使/ bin / csh认为它是“-sh”,尽管我不确定是否也应该让csh从外面看起来像“-sh”。另外,这是UNIX的例子,而我在Windows上。

我希望有一个脚本,正在运行(从命令行)spawnself.pl aaa.exe会产生自己,打印running as aaa.exe, PID is 1234,然后查看任务管理器会将此程序显示为“aaa。可执行程序”。但是,我的代码段以及世界其他地方仍将自己视为“perl.exe”:

  • 在任务管理器中,进程1234仍然被命名为“perl.exe”,因此它打印为
    running as C:\path\to\my\perl.exe, PID is 1234

我做错了什么?有人可以对此有所了解吗?

1 个答案:

答案 0 :(得分:1)

我发现了一个非常丑陋,虽然有效但黑客攻击:

#!perl -w
#spawnself-ugly.pl

use File::Copy;

if ($ARGV[0]) {
    my $name = ($ARGV[0]);
    copy($^X, $name);
    my @args = ($name, $0);
    system @args;
} else {
    print "running as $^X, PID is $$\n";
    print "press Enter to quit...\n";
    my $trash = <>;
}

我实际上制作了perl.exe的副本并运行那个,所以最后我只是正在运行“aaa.exe”,所以没有必要撒谎。