![](/img/trans.png)
[英]How can I find where a windows program is installed using only its full name? (And the name of his executable)
[英]How can a program delete its own executable
有什么方法可以讓正在運行的進程刪除自己的可執行文件?
例如,我制作了一個控制台應用程序(單個 exe),在完成一些任務后,它以某種方式刪除了 exe 文件。
我必須向某人發送一個文件。 我希望它在完成預期任務后被刪除。
無論如何在Windows中可以做到這一點
一種方法是使用帶有MOVEFILE_DELAY_UNTIL_REBOOT
標志和NULL
目標的MoveFileEx函數。 根據文檔,這是:
注冊系統重啟時要刪除的lpExistingFileName文件。 如果lpExistingFileName引用一個目錄,則系統僅在目錄為空時才會在重新啟動時刪除該目錄。
process.start("cmd /c ping localhost -n 3 > nul & del filepath")
exit
解釋 :
ping localhost -n 3
在執行del filepath
之前增加一點延遲。 當它被觸發時,您的程序已經退出。
將 process.start 替換為您的編程語言用來啟動帶參數的程序的任何命令。
將文件路徑替換為您的 exe 的路徑。
將 exit 替換為終止程序的命令。
===
10 周年編輯,如果這不起作用,您必須找到一種方法來執行“process.start”,它啟動一個單獨的(外部)進程,而不是從屬於您的原始調用程序: Python 、 Bash 、 C 、.. .... 或 搜索其他語言
用您的編程語言替換全部內容中的搜索,您可能會找到適合此基本步驟的指南。 請注意忽略多余的信息,因為每個問題都可能帶有與您無關的晦澀的具體細節。
您可以使用 Windows 調度程序安排任務以在 X 秒后刪除您的程序。
命令行:http: //msdn.microsoft.com/en-us/library/bb736357%28VS.85%29.aspx
或 API:http: //msdn.microsoft.com/en-us/library/aa383608%28VS.85%29.aspx
在 Linux 上可以做到這一點。 您會發現通常無法刪除 Windows 上正在運行的可執行文件。 但是,您可以讓 Windows 在下次重新啟動時為您刪除 EXE:http: //www.howtodothings.com/computers/a1402-delete-a-running-exe.html
如果您希望文件在運行后刪除,您可以簡單地要求用戶刪除它。 如果您想要這樣做的原因是作為一種安全措施,那么您正在做的事情是錯誤的。 用戶可以通過簡單地首先制作文件的副本來規避這一點。
您可以運行另一個應用程序,該應用程序將等待父進程終止,然后刪除其可執行文件。
雖然無法在文件運行時自行刪除文件,但可以從文件中啟動分離的 cmd 命令,然后在命令執行之前結束文件操作。 因此,如果要刪除 bat 文件,只需在文件末尾添加以下行: start cmd /c del %0
文件將自毀。
start cmd
將啟動一個新的 cmd 窗口(與主進程分離)。 /c
告訴窗口執行行中/c
之后的任何內容。 然后del
將刪除給定路徑的文件。 參數$0
指的是第一個命令行參數,它通常是執行文件的名稱和路徑,這是我們想要的。 ( $0
參數是文件的路徑,你想將它傳遞給 del 命令)。
在該 exe 在內存中之前,它將無法自行刪除。 但是,它可以向系統注冊一個任務,以便在預期完成其執行的設定時間間隔后刪除自己。
我通過創建一個批處理文件解決了這個問題(使用 Visual Basic),該批處理文件在進程仍在運行時執行,等待 1 秒,以便程序可以自行關閉,然后刪除程序。
您可能需要對其進行修改,因為這將刪除同一文件夾中的所有內容。 完成任務后,只需調用del()
即可。
Sub del()
Dim file As System.IO.StreamWriter
file = My.Computer.FileSystem.OpenTextFileWriter("del.bat", True)
file.WriteLine("")
file.WriteLine("timeout 1")
file.WriteLine("echo Y | del *.*")
file.Close()
Process.Start("del.bat")
Me.Close()
End Sub
我在其他任何地方都找不到任何解決方案,所以我將在這里發布我的修復。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char* argv[])
{
char* process_name = argv[0];
char command[256] = "start /min cmd /c del ";
strcat(command, process_name);
printf("Attempting to delete self...\n");
system(command);
return 0;
}
通常,嘗試使用system
調用命令提示符來刪除可執行文件是行不通的,因為生成的命令提示符是system
執行並等待返回狀態的子進程。
此方法調用系統在其自己的線程上啟動命令提示符進程。
/min
參數以“隱藏”方式啟動進程。
/c
參數為生成的命令提示符提供參數。
我知道這是一個老話題,但我希望將來能來這里的人。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.