使用Perl脚本终止正在运行的Windows应用程序
我试图从启动它的同一Perl程序中关闭正在运行的Windows应用程序。我试图使用taskkill
命令,但它不起作用。使用Perl脚本终止正在运行的Windows应用程序
这是我的Perl代码
system("D:/file.rtf");
sleep(2);
的sleep
我要终止打开该文件的过程后。我试过
taskkill("D:/file.rtf");
但它不工作。我怎样才能做到这一点?
脚本可能会需要知道哪些应用程序(可执行文件名称)将打开指定文件(file.rtf
)巡航能力上的读取。进程名称不会是数据文件的名称。为了鲁棒性,我会选择一个应用程序来打开文件(可能是Wordpad或Word)并明确调用它。这样,你就知道要杀死哪个进程。
如果你正在创建你自己的进程,那么Win32::Process应该允许你做你想做的。
下面是一个代码片段,它在记事本中打开一个文本文件。我没有充分理解为什么你必须给出可执行文件的完整路径,并在参数参数中提供它,但这是它的方式。大部分代码都是直接从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);
在你的情况,我可能会使用写字板(write.exe
)。
没有看到您的完整代码或知道您的通话很难说出什么命令。通常打电话给系统将等待,直到该过程提供回报。所以,如果我们使用一个简单的例子,如记事本。该过程将不会返回,直到记事本完成。在你的情况下,它意味着它不会去你的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
如果'$ f'是一个打开的文件句柄,则用'close $ f'关闭它。你究竟想要做什么? – 2014-12-19 03:26:11
@WilliamPursell'系统(文件名)'命令打开文件。然后由命令自动关闭。我不是说关于文件句柄,它只是关于用于perlscript的windows命令。否则,如何使用perl关闭窗口?你能理解编辑我的问题吗? – mkHun 2014-12-19 03:34:48
'系统(文件名)'不打开文件。它产生了一个试图执行该文件的shell。 – 2014-12-19 04:34:55