android遍历拼接字符串,写个批处理脚本帮忙干活---遍历amp;字符串处理
這次打算寫(xiě)幾篇關(guān)于腳本方面的博客,主要是記錄一下 Gradle 腳本和批處理腳本的一些寫(xiě)法,方便后續(xù)查閱。
前言
平常開(kāi)發(fā)過(guò)程中,一些較為重復(fù)的手工性工作,如果能讓腳本來(lái)幫忙處理,自然是最好的,剛好之前有些工作有點(diǎn)過(guò)于重復(fù)且都是手工性去完成,所以就想著能否寫(xiě)個(gè)腳本來(lái)處理。
因?yàn)槲疫€是用的 windows 開(kāi)發(fā),所以最開(kāi)始想到的就是批處理腳本,但寫(xiě)完后發(fā)現(xiàn),重復(fù)性工作是可以交給腳本去處理了,但每次要執(zhí)行這個(gè)腳本文件還得打開(kāi)腳本所在的文件夾找到腳本點(diǎn)擊去執(zhí)行。
emmm,因?yàn)槲沂情_(kāi)發(fā) Android 的,電腦開(kāi)機(jī)時(shí) Android Stuido 就沒(méi)關(guān)閉過(guò),然后又想到 Gradle 的腳本可以直接通過(guò) AS 來(lái)點(diǎn)擊執(zhí)行,這樣一來(lái),執(zhí)行腳本,也就是敲代碼過(guò)程中隨手一個(gè)快捷鍵就搞定,簡(jiǎn)單、方便。
所以,這篇就稍微來(lái)記錄下批處理腳本和 Gradle 腳本的一些寫(xiě)法,很基礎(chǔ)簡(jiǎn)單,因?yàn)槲业男枨缶褪菆?zhí)行 java 命令來(lái)對(duì)某個(gè)文件夾下的 apk 文件分別進(jìn)行簽名,而后輸出新的命名方式的 apk 文件。
所以,腳本涉及到的操作也就只是文件夾的遍歷、字符串的處理、命令的執(zhí)行這幾個(gè)方面而已,后續(xù)有新接觸再慢慢補(bǔ)充。
批處理腳本
1. 遍歷指定文件夾下的文件
1.1 命令解釋
命令: for [參數(shù)] %%變量名 in (匹配符) do (執(zhí)行的命令)
切記:每個(gè)指令之間必須以空格隔開(kāi),in 與 ( 之間有空格,do 與 ( 間也有空格,否則命令會(huì)無(wú)法成功執(zhí)行
ps:本節(jié)只講用批處理腳本執(zhí)行 for 命令遍歷文件夾的場(chǎng)景,因此以下分析每個(gè)指令意義時(shí),不介紹其他含義
[]:表示此項(xiàng)指令為可選
[參數(shù)]:參數(shù)取值一共有四種: /d, /r, /l, /f,加上無(wú)參數(shù),所以一共五種場(chǎng)景
無(wú)參:遍歷當(dāng)前路徑的文件夾下的文件,但也可在(匹配符)中指定路徑
/d:遍歷當(dāng)前路徑的文件夾下的文件夾,但也可在(匹配符)中指定路徑
/r [路徑]:深度遍歷指定路徑下的所有文件,子目錄中的文件也會(huì)被遍歷到,如果沒(méi)指定路徑,默認(rèn)當(dāng)前路徑
/l :當(dāng)使用參數(shù) /l 時(shí),需結(jié)合(匹配符)一起使用,此時(shí) () 括號(hào)內(nèi)部的用法規(guī)則為:(start, step, end),此時(shí)的 for 命令作用等同于 java 語(yǔ)言中的 for 語(yǔ)句
/f :用于解析文件中的內(nèi)容,本節(jié)不做介紹
%%變量名:作用類(lèi)似于 for(int i = 0; ; ) 中的 int i = 0,有些區(qū)別點(diǎn)的就是,批處理的 for 循環(huán)遍歷每一個(gè)子項(xiàng)時(shí),%%變量名 <=> 每個(gè)子項(xiàng),即 &&變量名 已經(jīng)是指向具體的每個(gè)子項(xiàng)了
(匹配符):在 in 指令之后 () 括號(hào)里的內(nèi)容可表示為通配符,用于按照指定的規(guī)則過(guò)濾文件夾下的文件,如 (*.txt) 表示遍歷文件夾內(nèi)所有以 .txt 結(jié)尾的文件
(執(zhí)行的命令):前面的指令就可以取到文件夾內(nèi)指定的每個(gè)子項(xiàng)了,那么接下去要對(duì)每個(gè)子項(xiàng)如何操作,就在這里寫(xiě),類(lèi)似于 java 的 for 命令后的 {} 大括號(hào)的作用
1.2 使用示例
以下示例基于上圖中的文件路徑,批處理腳本為 test.bat
無(wú)參:for %%i in (*) do ( echo %%i )
效果:遍歷當(dāng)前目錄下的所有文件
無(wú)參指定路徑:for %%i in (c:\softwares\VisualBat\*.url) do ( echo %%i )
效果:遍歷在(匹配符)中指定路徑下的以 .url 結(jié)尾的文件
帶參數(shù) /d:for /d %%i in (*) do ( echo %%i )
效果:遍歷當(dāng)前目錄下所有的文件夾
帶參數(shù) /d 指定路徑:for /d %%i in (c:\softwares\VisualBat\*) do ( echo %%i )
效果:遍歷指定目錄下的所有文件夾,%%i 指向每個(gè)子文件夾的絕對(duì)路徑
帶參數(shù) /r :for /r %%i in (*.url) do ( echo %%i )
效果:深度遍歷當(dāng)前路徑下所有以 .url 結(jié)尾的文件,因?yàn)槭巧疃缺闅v,因此 %%i 指向文件的絕對(duì)路徑
帶參數(shù) /r 指定路徑:for /r c:\softwares\VisualBat\ %%i in (*.url) do ( echo %%i )
效果:同上圖
帶參數(shù) /l :for /l %%i in (1, 1, 5) do ( echo %%i )
效果:等效于 java 中的 for (int i = 1; i <= 5; i++)語(yǔ)句,起始值,遞增或遞減,終止值都可自行設(shè)置
帶參數(shù) /d /r:for /d /r %%i in (*) do ( echo %%i )
效果:參數(shù)可結(jié)合使用,/d 表示遍歷文件夾,/r 表示深度遍歷,因此以上命令作用為深度遍歷當(dāng)前目錄下的所有文件夾,包括子目錄中的文件夾
2. 臨時(shí)變量的使用
2.1 變量的基本用法
命令:set key=value
切記:key=value 三者之間絕對(duì)不能出現(xiàn)空格,不能為了像遵守 java 風(fēng)格擅自給添加上空格,這與 java 的 int a = 1 聲明變量不同,切記
變量使用:%key%
示例:
@echo off
set name=dasuAndroidTv
echo %name%
效果:name 可當(dāng)做臨時(shí)變量使用,使用時(shí)需用 %% 將變量名括起來(lái)使用
局限:不允許在 for 命令中類(lèi)似上步中聲明變量并直接使用,如下:
@echo off
for /l %%i in (0,1,5) do (
set name=dasuAndroidTv
echo %name%
)
效果:在 for 命令中聲明臨時(shí)變量,并直接通過(guò) %key% 方式使用時(shí)會(huì)出現(xiàn)上圖中的錯(cuò)誤:ECHO 處于關(guān)閉狀態(tài),但如果 set key=value 臨時(shí)變量的聲明是放在 for 命令外部,for 命令內(nèi)部只是使用的話,是可以的,如下:
@echo off
set name=dasuAndroidTv
for /l %%i in (0,1,5) do (
echo %name%
)
效果:在 for 命令外部聲明臨時(shí)變量,for 命令內(nèi)部只是使用,這種方式是允許的
2.2 變量在 for 命令中的用法
提問(wèn):那么如果要在 for 命令中才聲明臨時(shí)變量,并使用的話,該如何做?
for 命令中臨時(shí)變量的使用:
需啟用變量延遲功能,命令:setlocal enabledelayedexpansion
for 命令中的臨時(shí)變量使用時(shí)用 !key! 感漢號(hào)括起來(lái)的形式代替 %key%
理由:不清楚,google 來(lái)的解決方案,感興趣想深入研究的自行搜索
示例:
@echo off
setlocal enabledelayedexpansion
set name=dasu
for /l %%i in (0, 1, 5) do (
set name=dasuAndroidTv
echo !name!
echo %name%
)
效果:說(shuō)得白一點(diǎn),在 for 命令中通過(guò) %name% 方式使用的臨時(shí)變量,取的 name 這個(gè)臨時(shí)變量的值會(huì)一直是它在 for 命令外賦值的內(nèi)容,即使在 for 命令中通過(guò) set 命令對(duì)這個(gè)變量又重新賦值,也不會(huì)生效。
那么,如果需要在 for 命令中通過(guò) set 命令賦值后的臨時(shí)變量能夠馬上拿來(lái)使用,需要兩個(gè)步驟,一在文件開(kāi)頭啟用變量延遲功能,命令:setlocal enabledelayedexpansion,二在 for 命令中通過(guò) !name!方式來(lái)使用臨時(shí)變量。
3. 字符串處理
3.1 截取
命令:%key:~[start,num]%
解釋:當(dāng) %key% 中出現(xiàn)了 :~,則表示要對(duì) key 指向的這個(gè)字符串做截取操作,截取操作支持以下幾種形式:
截取指定位置開(kāi)始的 n 個(gè)字符串:%key:~0,4%,表示截取從下標(biāo) 0 開(kāi)始的之后 4 個(gè)字符
截取從指定位置開(kāi)始的整個(gè)字符串:%key:~4%,表示截取從下標(biāo)為 4 開(kāi)始的整個(gè)字符串
截取通過(guò)倒數(shù)方式指定開(kāi)始位置的整個(gè)字符串:%key:~-2%,表示截取從倒數(shù)第 2 個(gè)字符開(kāi)始的整個(gè)字符串
截取通過(guò)倒數(shù)方式指定位置開(kāi)始之后的 n 個(gè)字符串:%key:-4,2%,表示截取從倒數(shù)第 4 個(gè)字符開(kāi)始的 2 個(gè)字符
正數(shù)倒數(shù)方式相結(jié)合:%key:~2,-2%,表示截取從下標(biāo) 2 開(kāi)始到倒數(shù)第 2 個(gè)之間的字符串
示例:
@echo off
rem (rem表示后面是注釋的內(nèi)容,類(lèi)似于 java //)原始字符串
set name=dasuAndroidTv
rem 注釋內(nèi)容:表示截取從下標(biāo) 0 開(kāi)始的之后 4 個(gè)字符,輸出 dasu
echo %name:~0,4%
rem 注釋內(nèi)容:表示截取從下標(biāo)為 4 開(kāi)始的整個(gè)字符串,輸出 AndroidTv
echo %name:~4%
rem 注釋內(nèi)容:表示截取從倒數(shù)第 2 個(gè)字符開(kāi)始的整個(gè)字符串,輸出 Tv
echo %name:~-2%
rem 注釋內(nèi)容:表示截取從倒數(shù)第 4 個(gè)字符開(kāi)始的 2 個(gè)字符,輸出 Android
echo %name:~4,-2%
rem 注釋內(nèi)容:表示截取從下標(biāo) 2 開(kāi)始到倒數(shù)第 2 個(gè)之間的字符串,輸出 id
echo %name:~-4,2%
3.2 拼接
命令:%key1%%key2%
解釋:將要拼接的那個(gè)字符串直接跟在被拼接的后面即可,不需要任何拼接操作符
示例:
@echo off
set name1=dasu
set name2=AndroidTv
echo %name1%%name2%
rem 這里是注釋內(nèi)容:輸出 dasuAndroidTv
3.3 替換
命令:%key:被替換字符串=替換的字符串%
解釋:不解釋了,直接看示例,很容易明白
示例:
@echo off
set name=whoAndroidTv
echo %name:who=dasu%
rem 這里是注釋內(nèi)容:輸出 dasuAndroid
3.4 文件特殊操作
如果是在 for 命令中遍歷了某個(gè)文件夾下的文件,那么此時(shí)可以通過(guò)一些特殊命令來(lái)獲取這個(gè)文件的各種信息,直接看示例:
@echo off
for %%i in (*.txt) do (
echo %%i
echo %%~fi
echo %%~di
echo %%~pi
echo %%~ni
echo %%~xi
echo %%~ti
echo %%~zi
)
解釋: 在通過(guò) for 命令遍歷文件時(shí),%%i 根據(jù)不同的 for 使用方式,內(nèi)容也有所不同,具體見(jiàn)第 1 節(jié)。在上述這種用法下,%%i 指向了當(dāng)前目錄下每個(gè)文件名,完整的文件名。
那么,此時(shí)就可以通過(guò)一些特殊命令來(lái)取得文件的相關(guān)信息,比如:
%%~fi:表示獲取該文件的絕對(duì)路徑信息
%%~di:表示獲取該文件所在的盤(pán)符
%%~pi:表示獲取該文件的路徑,不包含盤(pán)符的信息
%%~ni:表示獲取該文件的文件名,不包含擴(kuò)展名信息
%%~xi:表示獲取該文件的擴(kuò)展名
%%~ti:表示獲取該文件的上次修改時(shí)間
%%~zi:表示獲取該文件的大小
4. 完整示例
最后,我們來(lái)個(gè)具體場(chǎng)景,將本篇所學(xué)的知識(shí)用上一遍,鞏固一下。
場(chǎng)景:遍歷指定路徑目錄下的所有 apk 文件,并通過(guò)一個(gè) sign.jar 文件,分別對(duì)每個(gè) apk 文件執(zhí)行 java 命令來(lái)進(jìn)行簽名工作,sign.jar 接收兩個(gè)參數(shù),一個(gè)是需要簽名的 apk,另外一個(gè)為輸出的 apk,要求簽名后的 apk 命名方式為將原文件名中的 unsign 替換成 google,并輸出在跟 apk 同一個(gè)目錄內(nèi)即可。
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 這里是注釋內(nèi)容:由于 apk 文件 和 sign.jar 文件都是虛擬的,因此真正執(zhí)行時(shí)會(huì)報(bào)錯(cuò),這里就只是將 java 整句命令輸出,從整句命令就可以確認(rèn)是否會(huì)正確執(zhí)行,如果這些文件都是真的話。真的腳本應(yīng)該將 echo 去掉
)
效果:完美~
首先,遍歷指定目錄下的文件達(dá)到了,而且可以對(duì)文件名字符串進(jìn)行處理,替換其中一些值,最后,可以根據(jù)指定位置的 sign.jar 文件,通過(guò) java 命令來(lái)執(zhí)行簽名工作。
這個(gè)場(chǎng)景,剛好把我們今天學(xué)的關(guān)于批處理的遍歷文件夾操作、臨時(shí)變量使用、字符串的處理三者都包括在內(nèi),感興趣的也去試試看吧~
總結(jié)
以上是生活随笔為你收集整理的android遍历拼接字符串,写个批处理脚本帮忙干活---遍历amp;字符串处理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Android绑定多个aidl,andr
- 下一篇: html中选择收货地址时候,收货地址.h