此次打算寫幾篇關於腳本方面的博客,主要是記錄一下 Gradle 腳本和批處理腳本的一些寫法,方便後續查閱。java
日常開發過程當中,一些較爲重複的手工性工做,若是能讓腳原本幫忙處理,天然是最好的,恰好以前有些工做有點過於重複且都是手工性去完成,因此就想着可否寫個腳原本處理。windows
由於我仍是用的 windows 開發,因此最開始想到的就是批處理腳本,但寫完後發現,重複性工做是能夠交給腳本去處理了,但每次要執行這個腳本文件還得打開腳本所在的文件夾找到腳本點擊去執行。bash
emmm,由於我是開發 Android 的,電腦開機時 Android Stuido 就沒關閉過,而後又想到 Gradle 的腳本能夠直接經過 AS 來點擊執行,這樣一來,執行腳本,也就是敲代碼過程當中隨手一個快捷鍵就搞定,簡單、方便。ui
因此,這篇就稍微來記錄下批處理腳本和 Gradle 腳本的一些寫法,很基礎簡單,由於個人需求就是執行 java 命令來對某個文件夾下的 apk 文件分別進行簽名,然後輸出新的命名方式的 apk 文件。google
因此,腳本涉及到的操做也就只是文件夾的遍歷、字符串的處理、命令的執行這幾個方面而已,後續有新接觸再慢慢補充。url
命令: for [參數] %%變量名 in (匹配符) do (執行的命令)
spa
切記:每一個指令之間必須以空格隔開,in 與 ( 之間有空格,do 與 ( 間也有空格,不然命令會沒法成功執行debug
ps:本節只講用批處理腳本執行 for 命令遍歷文件夾的場景,所以如下分析每一個指令意義時,不介紹其餘含義code
[]:表示此項指令爲可選cdn
[參數]:參數取值一共有四種: /d, /r, /l, /f
,加上無參數,因此一共五種場景
(匹配符)
中指定路徑(匹配符)
中指定路徑(匹配符)
一塊兒使用,此時 ()
括號內部的用法規則爲:(start, step, end)
,此時的 for 命令做用等同於 java 語言中的 for 語句%%變量名:做用相似於 for(int i = 0; ; )
中的 int i = 0
,有些區別點的就是,批處理的 for 循環遍歷每個子項時,%%變量名
<=> 每一個子項,即 &&變量名
已是指向具體的每一個子項了
(匹配符):在 in 指令以後 () 括號裏的內容可表示爲通配符,用於按照指定的規則過濾文件夾下的文件,如 (*.txt) 表示遍歷文件夾內全部以 .txt 結尾的文件
(執行的命令):前面的指令就能夠取到文件夾內指定的每一個子項了,那麼接下去要對每一個子項如何操做,就在這裏寫,相似於 java 的 for 命令後的 {} 大括號的做用
如下示例基於上圖中的文件路徑,批處理腳本爲 test.bat
for %%i in (*) do ( echo %%i )
效果:遍歷當前目錄下的全部文件
for %%i in (c:\softwares\VisualBat\*.url) do ( echo %%i )
效果:遍歷在(匹配符)
中指定路徑下的以 .url 結尾的文件
for /d %%i in (*) do ( echo %%i )
效果:遍歷當前目錄下全部的文件夾
for /d %%i in (c:\softwares\VisualBat\*) do ( echo %%i )
效果:遍歷指定目錄下的全部文件夾,%%i 指向每一個子文件夾的絕對路徑
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++)
語句,起始值,遞增或遞減,終止值均可自行設置
for /d /r %%i in (*) do ( echo %%i )
效果:參數可結合使用,/d 表示遍歷文件夾,/r 表示深度遍歷,所以以上命令做用爲深度遍歷當前目錄下的全部文件夾,包括子目錄中的文件夾
命令:set key=value
切記:key=value
三者之間絕對不能出現空格,不能爲了像遵照 java 風格擅自給添加上空格,這與 java 的 int a = 1
聲明變量不一樣,切記
變量使用:%key%
示例:
@echo off
set name=dasuAndroidTv
echo %name%
複製代碼
效果:name 可當作臨時變量使用,使用時需用 %% 將變量名括起來使用
侷限:不容許在 for 命令中相似上步中聲明變量並直接使用,以下:
@echo off
for /l %%i in (0,1,5) do (
set name=dasuAndroidTv
echo %name%
)
複製代碼
效果:在 for 命令中聲明臨時變量,並直接經過 %key% 方式使用時會出現上圖中的錯誤:ECHO 處於關閉狀態,但若是 set key=value
臨時變量的聲明是放在 for 命令外部,for 命令內部只是使用的話,是能夠的,以下:
@echo off
set name=dasuAndroidTv
for /l %%i in (0,1,5) do (
echo %name%
)
複製代碼
效果:在 for 命令外部聲明臨時變量,for 命令內部只是使用,這種方式是容許的
提問:那麼若是要在 for 命令中才聲明臨時變量,並使用的話,該如何作?
for 命令中臨時變量的使用:
setlocal enabledelayedexpansion
!key!
感漢號括起來的形式代替 %key%
示例:
@echo off
setlocal enabledelayedexpansion
set name=dasu
for /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!
**方式來使用臨時變量。
命令:%key:~[start,num]%
解釋:當 %key%
中出現了 :~
,則表示要對 key 指向的這個字符串作截取操做,截取操做支持如下幾種形式:
%key:~0,4%
,表示截取從下標 0 開始的以後 4 個字符%key:~4%
,表示截取從下標爲 4 開始的整個字符串%key:~-2%
,表示截取從倒數第 2 個字符開始的整個字符串%key:-4,2%
,表示截取從倒數第 4 個字符開始的 2 個字符%key:~2,-2%
,表示截取從下標 2 開始到倒數第 2 個之間的字符串示例:
@echo off
rem (rem表示後面是註釋的內容,相似於 java //)原始字符串
set name=dasuAndroidTv
rem 註釋內容:表示截取從下標 0 開始的以後 4 個字符,輸出 dasu
echo %name:~0,4%
rem 註釋內容:表示截取從下標爲 4 開始的整個字符串,輸出 AndroidTv
echo %name:~4%
rem 註釋內容:表示截取從倒數第 2 個字符開始的整個字符串,輸出 Tv
echo %name:~-2%
rem 註釋內容:表示截取從倒數第 4 個字符開始的 2 個字符,輸出 Android
echo %name:~4,-2%
rem 註釋內容:表示截取從下標 2 開始到倒數第 2 個之間的字符串,輸出 id
echo %name:~-4,2%
複製代碼
命令:%key1%%key2%
解釋:將要拼接的那個字符串直接跟在被拼接的後面便可,不須要任何拼接操做符
示例:
@echo off
set name1=dasu
set name2=AndroidTv
echo %name1%%name2%
rem 這裏是註釋內容:輸出 dasuAndroidTv
複製代碼
命令:%key:被替換字符串=替換的字符串%
解釋:不解釋了,直接看示例,很容易明白
示例:
@echo off
set name=whoAndroidTv
echo %name:who=dasu%
rem 這裏是註釋內容:輸出 dasuAndroid
複製代碼
若是是在 for 命令中遍歷了某個文件夾下的文件,那麼此時能夠經過一些特殊命令來獲取這個文件的各類信息,直接看示例:
@echo off
for %%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 指向了當前目錄下每一個文件名,完整的文件名。
那麼,此時就能夠經過一些特殊命令來取得文件的相關信息,好比:
最後,咱們來個具體場景,將本篇所學的知識用上一遍,鞏固一下。
場景:遍歷指定路徑目錄下的全部 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 off
setlocal enabledelayedexpansion
set sign=c:\users\suxq\desktop\sign.jar
set apkPath=c:\users\suxq\desktop\outputs\
for %%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 去掉
)
複製代碼
效果:完美~
首先,遍歷指定目錄下的文件達到了,並且能夠對文件名字符串進行處理,替換其中一些值,最後,能夠根據指定位置的 sign.jar 文件,經過 java 命令來執行簽名工做。
這個場景,恰好把咱們今天學的關於批處理的遍歷文件夾操做、臨時變量使用、字符串的處理三者都包括在內,感興趣的也去試試看吧~