簡體   English   中英

使用Perl腳本終止正在運行的Windows應用程序

[英]Terminate a running Windows application using a Perl script

我正在嘗試從啟動它的同一Perl程序中關閉正在運行的Windows應用程序。 我正在嘗試使用taskkill命令,但是它不起作用。

這是我的Perl代碼

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

sleep后,我想終止打開文件的過程。 我努力了

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

但它不起作用。 我該如何實現?

在沒有看到完整代碼或不知道命令的情況下,很難說出來。 通常,調用系統將等待該過程提供返回。 因此,如果我們使用記事本之類的簡單示例。 在記事本完成之前,該過程不會返回。 在您的情況下,這意味着直到關閉之后,它才會轉到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的輸入args將殺死所有記事本進程,即使不是由perl代碼生成的進程也是如此。

在這里閱讀Task Kill文檔或Windows時的價值Taskkill文檔

該腳本可能需要知道哪個應用程序(可執行名稱)將打開給定文件( 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);

在您的情況下,我可能會使用寫字板( write.exe )。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM