sendkeys安装包_利用Windows命令行解压zip压缩文件(不借助第三方软件)
利用Windows命令行解壓zip壓縮文件(不借助第三方軟件)
發布時間:2019-05-14 15:33,
瀏覽次數:4280
, 標簽:
Windows
zip
首先說明一下本文的需求:利用Windows自帶的API、DLL或命令行參數等任何手段,解壓一個標準的zip壓縮文件,并且不借助任何第三方程序。
一、前言——徒勞的探索
為什么會提出這種需求呢?因為我近期在編程中,需要在程序運行時解壓一個zip文件,然后使用解壓出來的文件。之所以要強調不借助第三方軟件,是因為程序發布到客戶電腦后,不能指望(或要求)客戶電腦里必須有解壓縮軟件,因此利用Windows自帶的解壓縮功能是最保險的一個辦法。我本來以為這是一個非常簡單的需求,因為我在使用新裝的Windows時,文件管理器(Explorer.exe)都能直接提取zip文檔,因此我認為只要找到文件管理器里使用的解壓方式或是命令行參數,直接應用到我的程序里就萬事大吉了。
然而,事情并沒有我想的那么簡單。我搜遍了百度谷歌,各種中文英文論壇,網友們給出的方向無非兩條路。第一條路,Windows自帶的zip解壓功能位于zipfldr.dll中,只要弄清楚怎么利用這個dll文件就行了。然而這個dll并沒有提供公開的接口或命令行參數,唯一提供的還有點用的接口RouteTheCall只能顯示壓縮文件,并不能解壓文件。關于為什么這個dll不對外提供服務,網上也是眾說紛紜,有的說是這個dll文件功能還有缺陷,所以微軟不想公開參數;也有的說因為現在解壓縮zip文件的第三方軟件、代碼太多了,微軟沒必要再單獨提供一個接口了等云云。真實的原因我們不去考證,但是總結起來就是一句話,這條路行不通。第二條路,包括在Microsoft官方論壇上,有很多人說直接安個7-zip或者Winrar就能用命令行解壓了。或者有人沒說的這么直白,他們說你用個開源且免費的zlib(或其他開源代碼),然后就能很容易解壓zip軟件了。甚至更有很多自以為大師的小白說,打開cmd,輸入如下參數,就能解壓了:unzip.exe
mydata.zip –XXXXXX(或是winrar.exe –x
…….)。這些方式確實能解壓,但是卻與我的需求背道而馳,我的需求是不能借助任何第三方的程序便實現zip文檔的解壓。走這條路的一部分人也算實在,明確說這是利用第三方程序實現的,不利用第三方程序實現不了,另一部分“大師”級小白卻信誓旦旦地說,這就是Windows自帶的解壓(難道僅僅因為是命令要打到cmd里就算是Windows自帶的解壓方式了?)。除了上述兩條基本路線,還有一些比較冷門的說法,比如有人說Windows自帶的解壓程序是expand.exe,用這個可以解壓zip。這個程序其實只能解壓.cab文檔,之所以有人說這個能解壓zip是因為他們把一個文件的擴展名從.cab改成了.zip,然后用expand解壓,這樣當然能解壓了。如果是一個標準的zip,用expand是無論如何也解壓不了的(即使把文件擴展名改成.cab)。總之,經過數日的搜索與求助,結論是沒有任何一種方法可以不借助第三方程序解壓標準的zip。
二、進階——思路的轉變
既然網上沒有答案,那就自己解決,就像我當年研究0xc000007b問題時一樣(詳見《運行游戲時出現0xc000007b錯誤的解決方法
》),網上到處都是提問的,但是沒有一個回答是有效的。這次也是,網上回答雖然多,但是沒有能完全滿足我的需求的。首先需要梳理一下我的思路。我原來計劃的思路是:
1、得到一個zip壓縮文件;2、用Windows自帶的程序(或命令行等)解壓這個zip文件;3、使用解壓出來的文件(包括運行、復制、移動、重命名等)
在這個思路下,第2步就卡住了,后續自然也沒有后續了。但是仔細回憶一下,我當時產生這個需求的時候為什么覺得這個需求應該很簡單呢?因為我在使用原版Windows的時候,在文件管理器里只要雙擊就可以打開zip文檔,并且在文件管理器里可以瀏覽壓縮包里的所有文件,然后只要在要運行的程序上雙擊,就可以自動運行那個文件。整個過程就像打開一個普通文件夾,然后雙擊我要運行的程序一樣那樣自然,幾乎感覺不到這是個壓縮文檔,中間還要有解壓過程。那我的程序能不能也用這個思路解決呢?比如像這樣:
1、得到一個zip壓縮文件;2、打開這個zip壓縮文檔;3、運行我要運行的文件
在新思路的指引下我開始了我的嘗試,然后我意外的發現,這個方式居然成功了,我完全不去考慮到底要怎么解壓,我就把這個zip文檔當成一個普通的文件夾在文件管理器中打開,然后運行我要運行的程序。當我運行這個程序時,Windows自己在后臺便幫我把文件解壓好了,程序運行起來就像已經解壓好后再雙擊運行一樣。
三、方法——代碼的實現
下面我把實現的方法通過VB.NET代碼的形式展現出來,大家可以根據上面的思路結合代碼自行應用到其他語言上,或者直接在cmd命令行里運行也行。
第1步,首先找到一個示例的標準zip文檔,里面有exe程序,也有txt文檔,這里以我的DirectX修復工具在線修復版
為例,如圖1:
圖1. 示例zip文檔及文檔內文件
從上面的圖標可以看出來,我的系統里沒裝任何第三方解壓縮軟件,只能通過Windows Explorer打開。
第2步,新建一個空程序,主窗體上畫2個Button,然后打入代碼(如圖2)。Button1中的代碼是用來打開非exe文件的,Button2中的代碼是用來打開exe文件的。
圖2. 示例代碼 Public Class Form1 Private Sub Button1_Click(sender As System.Object,
e As System.EventArgs) Handles Button1.Click '打開一個zip壓縮文件中的非exe文件 Dim appID As
Integer appID = Shell("explorer
""C:\Users\zhangyue\Desktop\DirectXRepair_3.8_Online.zip\DirectXRepair_3.8_Online\使用說明.txt""",
AppWinStyle.NormalFocus) 'appID = Shell("explorer
""C:\Users\zhangyue\Desktop\DirectXRepair_3.8_Online.zip\DirectXRepair_3.8_Online\Data\A\xinput1_1.dll""",
AppWinStyle.NormalFocus) End Sub Private Sub Button2_Click(sender As
System.Object, e As System.EventArgs) Handles Button2.Click '打開一個zip壓縮文件中的exe文件
Dim appID As Integer appID = Shell("explorer
""C:\Users\zhangyue\Desktop\DirectXRepair_3.8_Online.zip\DirectXRepair_3.8_Online\DirectX
Repair.exe""", AppWinStyle.NormalFocus) Threading.Thread.Sleep(1000)
'需要一定的延遲,確保Explorer彈出對話框后再發送字母U My.Computer.Keyboard.SendKeys("U") End Sub End
Class
第3步,單擊Button1,可以看到使用說明.txt就被打開了,沒有一絲延遲,完全感受不到壓縮文檔的存在,就像文檔已經解壓好一樣,直接打開(如圖3)。Button1中的代碼可以推廣到打開所有的非exe文件上。
圖3. 直接打開(解壓)zip文檔中的txt文件
如果我們需要打開的是exe文件,假如也用Button1中的代碼,只是文件名換成XXX.exe的話,文件管理器會彈出一個對話框,如圖4。
圖4. Explorer.exe詢問用戶希望如何打開exe文件
這個提示的原因是因為,通常exe運行時,需要調用其文件夾中的dll文件或其他配置文件,方能正常運行,所以Windows會詢問用戶是否需要全部解壓這個zip文檔,還是只運行你選定的exe文件。由于DirectX
Repair.exe不需要調用任何dll文件,所以上圖中的對話框應該選擇第二個按鈕“運行”。關于這個選擇,我們也可以自動化完成,通過添加2行代碼(如圖5),即可實現自動點擊按鈕并正常運行程序。之所以發送字母U,是因為如圖4中,“運行”按鈕的快捷鍵為U。
圖5. 新增延遲代碼和按鍵代碼 Threading.Thread.Sleep(1000) '需要一定的延遲,確保Explorer彈出對話框后再發送字母U
My.Computer.Keyboard.SendKeys("U")
第4步,單擊Button2,可以看到DirectX修復工具主界面就被打開了。雖然代碼上會有一點點延時,但是畢竟還是自動化操作,還算可以接受。如圖6。
圖6.?直接打開(解壓)zip文檔中的exe文件
代碼中的延時代碼非常重要,如果沒有延時,文件管理器還沒彈出這個詢問框時,可能程序就把按鍵發過去了,這樣就會造成無法實現自動啟動。關于具體延時需要多少毫秒,這個大家可以自行設置。
四、提高——疑問的解答
說到這大家可能會有幾個疑問,我來一一解答。
問題1,有的時候我不只需要運行壓縮包里的文件,我需要復制、重命名或是提供命令參數運行等操作,這個怎么實現?以剛才第4步打開的DirectX
Repair.exe為例,一旦這個文件運行起來了,那么這個文件其實就已經被解壓了存在于你的電腦上了,只要到系統文件夾的Temp文件夾里找到解壓出來的exe文件(如圖7),那么你想對它做任何事都隨意了(圖中示例路徑為:C:\Users\zhangyue\AppData\Local\Temp\Temp1_DirectXRepair_3.8_Online.zip\DirectXRepair_3.8_Online\DirectX
Repair.exe)。
圖7. 可在系統Temp文件夾中找到已經解壓出來的exe文件
問題2,我的exe程序還需要zip文檔里dll文件等支持,怎們辦?這時在運行你的程序之前,先按照之前的第3步,把dll文件打開,然后另存到你需要的目錄下,將來運行exe時,到系統Temp文件夾中把exe也拷貝到你需要的目錄下,這樣就可以運行了。關于如何打開dll文件,我再給個提示,先到注冊表里,把dll文件的默認打開方式設置為記事本(如圖8),當按照第3步打開時,打開的就是一個記事本,只要把這個記事本保存并重命名為dll文件,即相當于對這個dll文件進行了解壓。讓dll文件通過記事本打開的注冊表具體位置為:Computer\HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.dll\UserChoice\Progid,值為:Applications\NOTEPAD.EXE
圖8. 在注冊表中設置默認通過記事本打開dll文件
問題3,我想后臺操作,怎么辦?這點我還沒有實踐,不過思路已經有了,就是首先后臺通過explorer打開一個zip壓縮文檔,然后利用Windows
API函數,把這個explorer中的文件默默拷貝出來,然后再關掉這個后臺explorer,即相當于在后臺把這個zip文檔解壓到了指定的文件夾。
五、結語——艱難的開端
關于我文中提到的方法,我毫不掩飾的說,并不完美,和我們的理想還有一定的差距。但是,這個方法是目前能滿足我的需求的唯一方法。第三方軟件固然方便,但是并不滿足我的需求;zipfldr.dll也許可以實現我的需求,但是目前我(包括大家)并沒有找到解決方法。萬事開頭難,從無到有是最困難的,雖然目前的方法不甚完美,但畢竟解決了有無問題,可以先用著,未來再不斷研究新方法,改進實現的方式。就好比10年前我研究0xc000007b問題時,我最開始給大家提出的解決方案是安裝DirectX9.0。雖然安裝DirectX9.0不是100%有效,但是最起碼解決了0xc000007b問題解決方案有無的問題,給大家指明了一個方向。后續針對0xc000007b問題發布的
DirectX修復工具 ,再到后來的
DirectX修復工具增強版
,可以說已經可以解決現在市面上95%的問題了,已經接近完美了。
關于用Windows自帶程序(或命令)解壓zip文檔的方案,我相信未來也可以變得更加高效、更加完美。如果各位對我的方案有任何意見或者建議,一定要及時告訴我,希望我們大家可以共同提高。
總結
以上是生活随笔為你收集整理的sendkeys安装包_利用Windows命令行解压zip压缩文件(不借助第三方软件)的全部內容,希望文章能夠幫你解決所遇到的問題。
 
                            
                        - 上一篇: yy自动语音接待机器人_人脸签到、发言记
- 下一篇: 基于DispatchProxy打造自定义
