標籤:資訊 apk oid 就是 strong 檔案中 基本用法 logs dex
批處理指令碼1. 遍曆指定檔案夾下的檔案1.1 命令解釋
命令: for [參數] %%變數名 in (匹配符) do (執行的命令)
切記:每個指令之間必須以空格隔開,in 與 ( 之間有空格,do 與 ( 間也有空格,否則命令會無法成功執行
ps:本節只講用批處理指令碼執行 for 命令遍曆檔案夾的情境,因此以下分析每個指令意義時,不介紹其他含義
[]:表示此項指令為可選
[參數]:參數取值一共有四種: /d, /r, /l, /f,加上無參數,所以一共五種情境
- 無參:遍曆當前路徑的檔案夾下的檔案,但也可在
(匹配符)中指定路徑
- /d:遍曆當前路徑的檔案夾下的檔案夾,但也可在
(匹配符)中指定路徑
- /r [路徑]:深度遍曆指定路徑下的所有檔案,子目錄中的檔案也會被遍曆到,如果沒指定路徑,預設當前路徑
- /l :當使用參數 /l 時,需結合
(匹配符)一起使用,此時 () 括弧內部的用法規則為:(start, step, end),此時的 for 命令作用等同於 java 語言中的 for 語句
- /f :用於解析檔案中的內容,本節不做介紹
%%變數名:作用類似於 for(int i = 0; ; ) 中的 int i = 0,有些區別點的就是,批處理的 for 迴圈遍曆每一個子項時,%%變數名 <=> 每個子項,即 &&變數名 已經是指向具體的每個子項了
(匹配符):在 in 指令之後 () 括弧裡的內容可表示為萬用字元,用於按照指定的規則過濾檔案夾下的檔案,如 (*.txt) 表示遍曆檔案夾內所有以 .txt 結尾的檔案
(執行的命令):前面的指令就可以取到檔案夾內指定的每個子項了,那麼接下去要對每個子項如何操作,就在這裡寫,類似於 java 的 for 命令後的 {} 大括弧的作用
1.2 使用樣本
以下樣本基於中的檔案路徑,批處理指令碼為 test.bat
- 無參:
for %%i in (*) do ( echo %%i )
效果:遍曆目前的目錄下的所有檔案
- 無參指定路徑:
for %%i in (c:\softwares\VisualBat\*.url) do ( echo %%i )
效果:遍曆在(匹配符)中指定路徑下的以 .url 結尾的檔案
- 帶參數 /d:
for /d %%i in (*) do ( echo %%i )
效果:遍曆目前的目錄下所有的檔案夾
- 帶參數 /d 指定路徑:
for /d %%i in (c:\softwares\VisualBat\*) do ( echo %%i )
效果:遍曆指定目錄下的所有檔案夾,%%i 指向每個子檔案夾的絕對路徑
- 帶參數 /r :
for /r %%i in (*.url) do ( echo %%i )
效果:深度遍曆當前路徑下所有以 .url 結尾的檔案,因為是深度遍曆,因此 %%i 指向檔案的絕對路徑
帶參數 /r 指定路徑:for /r c:\softwares\VisualBat\ %%i in (*.url) do ( echo %%i )
效果:同
帶參數 /l :for /l %%i in (1, 1, 5) do ( echo %%i )
效果:等效於 java 中的 for (int i = 1; i <= 5; i++)語句,起始值,遞增或遞減,終止值都可自行設定
- 帶參數 /d /r:
for /d /r %%i in (*) do ( echo %%i )
效果:參數可結合使用,/d 表示遍曆檔案夾,/r 表示深度遍曆,因此以上命令作用為深度遍曆目前的目錄下的所有檔案夾,包括子目錄中的檔案夾
2. 臨時變數的使用2.1 變數的基本用法
命令:set key=value
切記:key=value 三者之間絕對不能出現空格,不能為了像遵守 java 風格擅自給添加上空格,這與 java 的 int a = 1 聲明變數不同,切記
變數使用:%key%
樣本:
@echo offset name=dasuAndroidTvecho %name%
效果:name 可當做臨時變數使用,使用時需用 %% 將變數名括起來使用
局限:不允許在 for 命令中類似上步中聲明變數並直接使用,如下:
@echo offfor /l %%i in (0,1,5) do ( set name=dasuAndroidTv echo %name%)
效果:在 for 命令中聲明臨時變數,並直接通過 %key% 方式使用時會出現中的錯誤:ECHO 處於關閉狀態,但如果 set key=value 臨時變數的聲明是放在 for 命令外部,for 命令內部只是使用的話,是可以的,如下:
@echo offset name=dasuAndroidTvfor /l %%i in (0,1,5) do ( echo %name%)
效果:在 for 命令外部聲明臨時變數,for 命令內部只是使用,這種方式是允許的
2.2 變數在 for 命令中的用法
提問:那麼如果要在 for 命令中才聲明臨時變數,並使用的話,該如何做?
for 命令中臨時變數的使用:
- 需啟用變數延遲功能,命令:
setlocal enabledelayedexpansion
- for 命令中的臨時變數使用時用
!key! 感漢號括起來的形式代替 %key%
- 理由:不清楚,google 來的解決方案,感興趣想深入研究的自行搜尋
樣本:
@echo offsetlocal enabledelayedexpansionset name=dasufor /l %%i in (0, 1, 5) do ( set name=dasuAndroidTv echo !name! echo %name%)
效果:說得白一點,在 for 命令中通過 %name% 方式使用的臨時變數,取的 name 這個臨時變數的值會一直是它在 for 命令外賦值的內容,即使在 for 命令中通過 set 命令對這個變數又重新賦值,也不會生效。
那麼,如果需要在 for 命令中通過 set 命令賦值後的臨時變數能夠馬上拿來使用,需要兩個步驟,一在檔案開頭啟用變數延遲功能,命令:setlocal enabledelayedexpansion,二在 for 命令中通過 !name!方式來使用臨時變數。
3. 字串處理3.1 截取
命令:%key:~[start,num]%
解釋:當 %key% 中出現了 :~,則表示要對 key 指向的這個字串做截取操作,截取操作支援以下幾種形式:
- 截取指定位置開始的 n 個字串:
%key:~0,4%,表示截取從下標 0 開始的之後 4 個字元
- 截取從指定位置開始的整個字串:
%key:~4%,表示截取從下標為 4 開始的整個字串
- 截取通過倒數方式指定開始位置的整個字串:
%key:~-2%,表示截取從倒數第 2 個字元開始的整個字串
- 截取通過倒數方式指定位置開始之後的 n 個字串:
%key:-4,2%,表示截取從倒數第 4 個字元開始的 2 個字元
- 正數倒數方式相結合:
%key:~2,-2%,表示截取從下標 2 開始到倒數第 2 個之間的字串
樣本:
@echo offrem (rem表示後面是注釋的內容,類似於 java //)原始字串set name=dasuAndroidTvrem 注釋內容:表示截取從下標 0 開始的之後 4 個字元,輸出 dasuecho %name:~0,4%rem 注釋內容:表示截取從下標為 4 開始的整個字串,輸出 AndroidTvecho %name:~4% rem 注釋內容:表示截取從倒數第 2 個字元開始的整個字串,輸出 Tvecho %name:~-2%rem 注釋內容:表示截取從倒數第 4 個字元開始的 2 個字元,輸出 Androidecho %name:~4,-2%rem 注釋內容:表示截取從下標 2 開始到倒數第 2 個之間的字串,輸出 idecho %name:~-4,2%
3.2 拼接
命令:%key1%%key2%
解釋:將要拼接的那個字串直接跟在被拼接的後面即可,不需要任何拼接操作符
樣本:
@echo offset name1=dasuset name2=AndroidTvecho %name1%%name2% rem 這裡是注釋內容:輸出 dasuAndroidTv
3.3 替換
命令:%key:被替換字串=替換的字串%
解釋:不解釋了,直接看樣本,很容易明白
樣本:
@echo offset name=whoAndroidTvecho %name:who=dasu%rem 這裡是注釋內容:輸出 dasuAndroid
3.4 檔案特殊操作
如果是在 for 命令中遍曆了某個檔案夾下的檔案,那麼此時可以通過一些特殊命令來擷取這個檔案的各種資訊,直接看樣本:
@echo offfor %%i in (*.txt) do ( echo %%i echo %%~fi echo %%~di echo %%~pi echo %%~ni echo %%~xi echo %%~ti echo %%~zi)
解釋: 在通過 for 命令遍曆檔案時,%%i 根據不同的 for 使用方式,內容也有所不同,具體見第 1 節。在上述這種用法下,%%i 指向了目前的目錄下每個檔案名稱,完整的檔案名稱。
那麼,此時就可以通過一些特殊命令來取得檔案的相關資訊,比如:
- %%~fi:表示擷取該檔案的絕對路徑資訊
- %%~di:表示擷取該檔案所在的盤符
- %%~pi:表示擷取該檔案的路徑,不包含盤符的資訊
- %%~ni:表示擷取該檔案的檔案名稱,不包含副檔名資訊
- %%~xi:表示擷取該檔案的副檔名
- %%~ti:表示擷取該檔案的上次修改時間
- %%~zi:表示擷取該檔案的大小
4. 完整樣本
最後,我們來個具體情境,將本篇所學的知識用上一遍,鞏固一下。
情境:遍曆指定路徑目錄下的所有 apk 檔案,並通過一個 sign.jar 檔案,分別對每個 apk 檔案執行 java 命令來進行簽名工作,sign.jar 接收兩個參數,一個是需要簽名的 apk,另外一個為輸出的 apk,要求籤名後的 apk 命名方式為將原檔案名稱中的 unsign 替換成 google,並輸出在跟 apk 同一個目錄內即可。
apk 路徑:c:\users\suxq\desktop\outputs
sign.jar 路徑:c:\users\suxq\desktop
java 簽名命令樣本(要求 sign.jar 和 apk 檔案都在同一路徑下,即可用如下命令):
java -jar sign.jar meizi_1_3_0_debug_unsign.apk meizi_1_3_0_debug_google.apk
批處理指令碼代碼:
@echo offsetlocal enabledelayedexpansionset sign=c:\users\suxq\desktop\sign.jarset apkPath=c:\users\suxq\desktop\outputsfor %%i in (%apkPath%*.apk) do ( set oldApk=%%~nxi set outApk=!oldApk:unsign=google! echo java -jar %sign% !oldApk! !outApk! rem 這裡是注釋內容:由於 apk 檔案 和 sign.jar 檔案都是虛擬,因此真正執行時會報錯,這裡就只是將 java 整句命令輸出,從整句命令就可以確認是否會正確執行,如果這些檔案都是真的話。真的指令碼應該將 echo 去掉)
from: https://www.cnblogs.com/dasusu/p/9058554.html
批處理指令碼遍曆指定檔案夾下的檔案