使用Perl脚本终止正在运行的Windows应用程序

时间:2014-12-19 02:55:59

标签: windows perl process

我试图从启动它的同一个Perl程序中关闭正在运行的Windows应用程序。我尝试使用taskkill命令,但它无法正常工作。

这是我的Perl代码

 system("D:/file.rtf");
 sleep(2);

sleep之后我想终止打开文件的进程。我试过了

 taskkill("D:/file.rtf");

但它不起作用。我怎样才能做到这一点?

2 个答案:

答案 0 :(得分:2)

没有看到您的完整代码或知道您的呼叫所执行的命令很难说。通常对系统进行调用将等待该进程提供返回。所以如果我们使用像记事本这样的简单例子。在记事本完成之前,该过程不会返回。在你的情况下,它意味着它不会转到你的perl代码的下一行关闭它直到它关闭之后。我已经编写了下面的工作示例,希望能让您了解这是如何工作的。它使用fork生成子进程来启动记事本应用程序,然后父进程在关闭之前等待5秒。

use strict;
use warnings;

my $pid = fork;
unless($pid){
system('C:\Windows\system32\notepad.exe');
} else {
    sleep 5;
    system('TASKKILL /F /IM notepad* /T 2>nul');
}

这将产生输出

SUCCESS: The process with PID 1240 (child process of PID 4828) has been terminated.

然后您应该看到记事本窗口已关闭。但是,这是一个通用示例,向您展示它是如何工作的。在这种情况下,taskkill的输入参数将杀死所有记事本进程,即使那些没有由perl代码生成的进程也是如此。

在这里阅读任务杀死文档或窗口taskkill documentation

时,它的价值

答案 1 :(得分:2)

脚本可能需要知道哪个应用程序(可执行文件名)将打开给定文件(file.rtf)。进程名称不是数据文件的名称。为了健壮,我会选择一个应用程序来打开文件(可能是Wordpad或Word)并显式调用它。这样,你知道要杀死什么过程。

如果您正在创建自己的流程,那么Win32::Process应该允许您执行您想要的操作。

这是一个在记事本中打开文本文件的代码段。我没有充分理解为什么你必须提供可执行文件的完整路径,并在arguments参数中提供它,但这就是它的方式。大部分代码都是直接从Win32 :: Process文档中获取的。

#!perl

use Win32::Process;
use Win32;

sub ErrorReport{
    print Win32::FormatMessage( Win32::GetLastError() );
}

Win32::Process::Create($ProcessObj,
                       "C:\\windows\\system32\\notepad.exe",
                       "notepad test.txt",
                       0,
                       NORMAL_PRIORITY_CLASS,
                       ".")|| die ErrorReport();


sleep(3);

$ProcessObj->Kill(0);

在您的情况下,我可能会使用Wordpad(write.exe)。