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

问题描述:

我试图从启动它的同一Perl程序中关闭正在运行的Windows应用程序。我试图使用taskkill命令,但它不起作用。使用Perl脚本终止正在运行的Windows应用程序

这是我的Perl代码

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

sleep我要终止打开该文件的过程后。我试过

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

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

+0

如果'$ f'是一个打开的文件句柄,则用'close $ f'关闭它。你究竟想要做什么? – 2014-12-19 03:26:11

+0

@WilliamPursell'系统​​(文件名)'命令打开文件。然后由命令自动关闭。我不是说关于文件句柄,它只是关于用于perlscript的windows命令。否则,如何使用perl关闭窗口?你能理解编辑我的问题吗? – mkHun 2014-12-19 03:34:48

+0

'系统(文件名)'不打开文件。它产生了一个试图执行该文件的shell。 – 2014-12-19 04:34:55

脚本可能会需要知道哪些应用程序(可执行文件名称)将打开指定文件(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