我试图从启动它的同一个Perl程序中关闭正在运行的Windows应用程序。我尝试使用taskkill
命令,但它无法正常工作。
这是我的Perl代码
system("D:/file.rtf");
sleep(2);
sleep
之后我想终止打开文件的进程。我试过了
taskkill("D:/file.rtf");
但它不起作用。我怎样才能做到这一点?
答案 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
)。