簡體   English   中英

程序如何刪除自己的可執行文件

[英]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”,它啟動一個單獨的(外部)進程,而不是從屬於您的原始調用程序: PythonBashC 、.. .... 或 搜索其他語言

用您的編程語言替換全部內容中的搜索,您可能會找到適合此基本步驟的指南。 請注意忽略多余的信息,因為每個問題都可能帶有與您無關的晦澀的具體細節。

您可以使用 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.

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