[英]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.