題 為什麼不能在Windows中一次卸載多個程序?


為什麼Windows不允許您一次卸載或刪除多個程序?這背後的原因是什麼?它會搞亂內部系統嗎?

我不是在尋找如何一次卸載多個程序,我只是在尋找一個不能選擇它的原因。


96
2018-03-19 15:31


起源


讓人們不要一次性卸載所有東西......也許吧。 - M.Bennett
@ M.Bennett我也在考慮這個問題,但是沒有辦法選擇多個程序,因此無論如何用戶都無法真正卸載所有內容。 - Jeroen Bollen
實際上,你可以一次刪除多個程序,它唯一的Windows安裝程序阻止你卸載多個程序,因為它只允許自己的單個實例。刪除程序文件很容易,如果需要,可以刪除程序文件的所有內容,這將無法有效地卸載這些程序。 - Ramhound
@Ramhound:你似乎是唯一正確理解提問者意圖的人:他希望系統卸載程序 在  序列。這裡的回答者不同地理解他的問題:是否可能 同時 卸載幾個程序。毋庸置疑,在Linux中它很容易實現:你只需鍵入即可 apt-get -y uninstall prog1 prog2 prog3。 - Niccolo M.
@NiccoloM我的問題實際上是為什麼你不能同時。 :P - Jeroen Bollen


答案:


如果您閱讀有關Windows安裝程序系統如何工作的任何內容,很明顯他們將一些想法從事務數據庫應用到程序安裝和維護,更不用說 .msi 文件本身就是一個數據庫。

設計任何數據庫總是存在問題 - 你想要速度還是準確度/安全性?鑑於安裝人員可以修改系統配置並且不幸事故可能導致系統無法運行,因此安全性優先於速度。其中一個原因 .msi 安裝程序是如此之慢是因為為每個文件等製作了回滾文件,這些文件將被修改,然後被刪除 - 允許任何更改被“回滾”,如果事情出現問題(例如斷電)或系統崩潰)。

現在,我相信MSI引擎本身一次只強制安裝,修改或刪除一個程序 - 如果你試圖運行一個程序 .msi 而另一個是卸載,例如,它將無法運行或將等待當前正在運行的卸載完成。非MSI安裝程序可能不會以這種方式運行 - 因為它們不使用MSI引擎。但由於這個安全設計決定,這可能就是原因 appwiz.cpl 堅持只允許一次調用一個卸載程序。

CCleaner允許您啟動卸載程序,而無需等待以前運行的卸載程序完成。由於上述原因,MSI安裝程序可能仍然無法並行工作。


100
2018-03-19 15:49



有一點需要注意的是,類Unix系統上的軟件包管理器也不會出於同樣的原因同時刪除多個軟件包。如果刪除多個包,則會逐個刪除它們,可能每個都在自己的事務中。 - Joey
+1精湛的答案!有一點需要注意。如果你在一個文件夾中有一堆獨立的可執行文件,比如CPU-Z,那麼可以一次卸載(刪除)它們。 - MonkeyZeus
@Joey這是真的,但你至少可以指示* nix包經理這樣做,他們會計算出訂單。我認為更大的問題是Windows不了解包管理級別的依賴概念。 - tudor
@tudor:我認為這對於在不同操作系統上管理應用程序的方式來說只是一個區別。 Windows管理 應用,在Unix喜歡的包管理器管理,嗯, 包,可以是圖書館,應用程序和類似的東西。視窗 能夠 管理這些事情(它確實在內部確實如此,例如當您啟用或禁用Windows組件時),但是在90年代後期,系統範圍內的第三方庫並沒有如此出色,因此鼓勵應用程序只捆綁所有他們的依賴。 - Joey
@Joey我明白你的觀點,但是 指責用戶 (或開發者)在這樣一個開放的共享空間中不會走得太遠。用戶只能查看應用程序,但應用程序只是包的子集。多個庫,即使是不同的版本和供應商,也只需要 管理。要求開發人員管理它是最好的樂觀,恕我直言,並導致沉重的膨脹。 Windows Store在這方面取得了一些進展,但它距離自動依賴解析還有很長的路要走,這使得* nixes在這方面變得如此簡單。 - tudor


這只適用於使用該程序的程序 Windows Installer 系統。

如果程序使用自己的(非)安裝程序系統,那麼沒有什麼可以阻止您同時運行另一個卸載程序。

Windows Installer限制實例數,以避免多個程序在更改系統範圍(通常是共享)設置和文件時發生衝突。

大多數卸載程序會跟踪它們正在更改的內容,以便在出現故障時可以成功回滾。如果一個人不知道正在進行的所有更改(由其他卸載程序),那麼如果它嘗試回滾失敗的安裝,它實際上可能會使事情變得糟糕。

創建Windows Installer系統的目的是成為所有應用程序開發人員使用的統一系統(在Windows上),以幫助避免這些問題。


19
2018-03-19 15:40





卸載任務經常修改由多個程序或系統文件\註冊表共享的文件(需要管理權力才能執行此操作的部分原因)。如果多個卸載任務同時運行,則可能會發生衝突。如果你曾經遇到過“DLL Hell”,它會是一樣的。其他程序或Windows本身可能會處於不一致狀態。


9
2018-03-19 15:40



這是正確答案的大部分內容。如果程序“A”安裝非核心Windows DLL“X”,那麼程序“B”在其安裝程序中需要它,那麼它同樣可能是卸載程序的一部分。但卸載DLL“X”會破壞程序“A”。因此卸載程序通常會詢問共享DLL和其他文件是否應刪除。如果同時運行,這種提示無法正常運行。最後,也許更重要的是,每個人都忘記了Windows註冊表 - 這是一個數據庫核心組件,經常在安裝程序/卸載程序中更新。 - Darrell Teague


除了解決其他提到的潛在問題之外,同時卸載程序幾乎沒有什麼好處:它不會比按順序卸載程序快得多。解除程序是一項涉及磁盤IO的任務。運行幾個執行IO的程序並不比順序運行它們快(除非程序安裝在兩個單獨的物理磁盤上)。 事實上,它可能會變慢 因為兩個競爭的IO任務會使磁盤緩存效率降低,磁盤的物理磁頭必須從一個地方跳到另一個地方。


-1
2018-03-20 19:33



這與答案無關。如果你一次做太多事情,所有涉及磁盤I / O的東西都有可能減速,但Windows真的唯一 防止 你做的是同步(un)安裝。並且有一個很好的理由希望能夠同時進行(un)安裝 - 用戶可以更容易地排隊一堆操作並讓它們全部一起運行,而不是等待坐下來等待每一個依次完成。此外,SSD的爭用問題已經過時。 - Andrew Medico