開發的遊戲項目,需要一個工具,對指定的資源進行復制、加密,然後打包。之前打包時都手工操作,複製與加密這二步分別寫了幾個工具(lua加密與圖片資源加密是分開的),後來感覺bat操作路徑特別麻煩,所以我改用了hta寫了一個界面,讓使用者可以輸入版本號,控制檯上顯示程序運行狀態…
寫到的過程中,遇到幾個坑,一併在這裏記錄下來。
===============================================
bat
遍歷一個目錄,並在另外一個目錄創建相同的目錄文件
cd /d %src_dir% setlocal EnableDelayedExpansion for /r /d %%i in (%src_dir%) do ( set relativePath=%%i set relativePath=!relativePath:%src_dir%=! set targetFullPath=%target_dir%!relativePath! if exist !targetFullPath! rd /s /q !targetFullPath! mkdir !targetFullPath! ) endlocal
這裏主要在於使用了“EnableDelayedExpansion” (延遲環境變量擴展),爲什麼要使用它呢?看下面的一個示例:
@echo off for /l %%i in (1,1,5) do ( set var=%%i echo %var% )
上面的代碼執行後會輸出5個空行,有人可能會問,不是把變量%%i賦值給var變量了嗎?在這裏如果想達到預期的目的,就需要使用“EnableDelayedExpansion”了
@echo off setlocal ENABLEDELAYEDEXPANSION for /l %%i in (1,1,5) do ( set var=%%i echo !var! ) endlocal
在開啓“EnableDelayedExpansion”中,使用!!來替換%%進行操作
字符串替換的語法:%var:str1=str2%,將字符串var中所有的str替換爲str2
所以上面的=!relativePath:%src_dir%=!就容易理解了吧
bat中調用應用程序
start ["title"] [/dPath] [/i] [/min] [/max] [{/separate | /shared}] [{/low | /normal | /high | /realtime | /abovenormal | belownormal}] [/wait] [/b] [FileName] [parameters]
start luac.exe –o path1 path2
hta調用bat
這個其實沒有什麼難度,方法也十分簡單
var wsh = new ActiveXObject("WScript.Shell");
var rs = wsh.Run(“d:\xx\xx.bat param1 param2”, 0, true);
WScript.Shell 提供對本地Window外殼程序的訪問,它擁有3個屬性及11個方法。
屬性:CurrentDirectory、Environment、SpecialFolders
方法:
AppActivate、CreateShortcut、ExpandEnvironmentStrings、LogEvent、Popup、RegDelete、RegRead、RegRead、RegWrite、Run、SendKeys、Exec
hta調用bat使用的就是Run方法,這裏重點介紹一下Run方法
object.Run(strCommand, [intWindowStyle], [bWaitOnReturn])
參數
object
WshShell 對象。 strCommand表示要運行的命令行的字符串值。必須包括要傳遞到可執行文件的所有參數。 intWindowStyle可選。表示程序窗口外觀的整數值。請注意,並非所有程序都使用此信息。 bWaitOnReturn可選。布爾值,表示在繼續執行腳本中的下一條語句之前,腳本是否等待執行完程序。如果設爲 true,則在執行完程序後才執行腳本,Run 方法返回由程序返回的任何錯誤代碼。如果設爲 false(默認值),則 Run 方法將自動在啓動程序後立即返回 0(不是錯誤代碼)。
Run 方法返回一個整數。Run 方法啓動在新 Windows 進程中運行的程序。可以讓腳本等到程序執行完後再繼續執行。這允許您同步運行腳本和程序。strCommand 參數內的環境變量自動擴展。如果某個文件類型已正確註冊到某個程序中,則對該類型的文件調用 Run 方法時將執行該程序。例如,如果您的計算機系統中裝有 Word,則對 *.doc 文件調用 Run 方法時將啓動 Word 並加載該文檔。下表列出了 intWindowStyle 的可用設置。
在調用bat的時候可以傳遞參數,上面的param1、param2就是傳入的參數,在bat中通過%1、%2..%n進行獲取。
只是如果傳入的參數是路徑,必須是“\”而不能爲“/”,否則某些應用程序在讀取路徑時會找不到路徑,導致程序執行失敗。
通過WScript.Shell對象獲取應用程序的執行目錄,例如現在想獲得WinRAR的應用程序目錄:
rarPath = wsh.RegRead("HKEY_CLASSES_ROOT\\WinRAR\\shell\\open\\command\\").match(/"([^"]*)"/)[1];
調用Run方法便可以調用它了
WinRAR常用的參數:
a 添加文件到壓縮文件 -r 包含子文件夾 -ep1 將需要打包的文件夾目錄包含進去,-ep不包含 -inul 禁用所有消息 -df 壓縮後刪除文件 m<0..5> 設置壓縮級別(0-存儲...3-默認...5-最大)
-x 排除指定的文件
x@<列表> 排除指定列表文件中的文件
n<文件> 僅包含指定的文件
n@ 從標準輸入設備讀取文件名到包括
n@<列表> 在指定的文件列表包括文件
例:僅打包該目錄下的*.xml文件 “WinRAR.exe a -ep -m5 -inul -n*.xml”
===============================================
如果想深入學習和了解bat,建議下載Visual Bat軟件進行學習,內置chm幫助文檔
hat,建議下載HtaEdit進行學習