这次打算写几篇关于脚本方面的博客,主要是记录一下 Gradle 脚本和批处理脚本的一些写法,方便后续查阅。

前言

平常开发过程中,一些较为重复的手工性工作,如果能让脚本来帮忙处理,自然是最好的,刚好之前有些工作有点过于重复且都是手工性去完成,所以就想着能否写个脚本来处理。

因为我还是用的 windows 开发,所以最开始想到的就是批处理脚本,但写完后发现,重复性工作是可以交给脚本去处理了,但每次要执行这个脚本文件还得打开脚本所在的文件夹找到脚本点击去执行。

emmm,因为我是开发 Android 的,电脑开机时 Android Stuido 就没关闭过,然后又想到 Gradle 的脚本可以直接通过 AS 来点击执行,这样一来,执行脚本,也就是敲代码过程中随手一个快捷键就搞定,简单、方便。

所以,这篇就稍微来记录下批处理脚本和 Gradle 脚本的一些写法,很基础简单,因为我的需求就是执行 java 命令来对某个文件夹下的 apk 文件分别进行签名,而后输出新的命名方式的 apk 文件。

所以,脚本涉及到的操作也就只是文件夹的遍历、字符串的处理、命令的执行这几个方面而已,后续有新接触再慢慢补充。

批处理脚本

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 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 命令内部只是使用,这种方式是允许的

2.2 变量在 for 命令中的用法

提问:那么如果要在 for 命令中才声明临时变量,并使用的话,该如何做?

for 命令中临时变量的使用:

需启用变量延迟功能,命令:setlocal enabledelayedexpansion

for 命令中的临时变量使用时用 !key! 感汉号括起来的形式代替 %key%

理由:不清楚,google 来的解决方案,感兴趣想深入研究的自行搜索

示例:

@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!方式来使用临时变量。

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 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%

3.2 拼接

命令:%key1%%key2%

解释:将要拼接的那个字符串直接跟在被拼接的后面即可,不需要任何拼接操作符

示例:

@echo off

set name1=dasu

set name2=AndroidTv

echo %name1%%name2%

rem 这里是注释内容:输出 dasuAndroidTv

3.3 替换

命令:%key:被替换字符串=替换的字符串%

解释:不解释了,直接看示例,很容易明白

示例:

@echo off

set name=whoAndroidTv

echo %name:who=dasu%

rem 这里是注释内容:输出 dasuAndroid

3.4 文件特殊操作

如果是在 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 指向了当前目录下每个文件名,完整的文件名。

那么,此时就可以通过一些特殊命令来取得文件的相关信息,比如:

%%~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 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 命令来执行签名工作。

这个场景,刚好把我们今天学的关于批处理的遍历文件夹操作、临时变量使用、字符串的处理三者都包括在内,感兴趣的也去试试看吧~

android遍历拼接字符串,写个批处理脚本帮忙干活---遍历amp;字符串处理相关推荐

  1. map迭代器遍历_一口气写了 HashMap 的 7种遍历方式,被同事夸了

    随着 JDK 1.8 Streams API 的发布,使得 HashMap 拥有了更多的遍历的方式,但应该选择那种遍历方式?反而成了一个问题. 本文先从 HashMap 的遍历方法讲起,然后再从性能. ...

  2. linux匹配字符串型号,Linux shell脚本:如何匹配子字符串和正则表达式

    如何获得所有具有"client_type = 0"的"clid's"?管道字符"|"分离每个客户的信息.文本,我有仅仅是一个行:Linux ...

  3. bat递归查找指定文件_dos命令find图文教程,查找搜索文件文本字符串,bat批处理脚本...

    大家好,我是老盖,首先感谢观看本文,本篇文章做的有视频,视频讲述的比较详细,也可以看我发布的视频. 今天,我们学习DOS命令中的find这个命令,它这个命令可以查询文件的字符串,也可以查询另外其他命令 ...

  4. BAT批处理脚本案例--计算字符串长度

    BAT批处理脚本没有提供字符串长度计算函数,为此需要自定义实现,本例将涉及批处理脚本下述几个关键知识点: 1)call 调用,调用结果如何赋值给变量 2)字符串截取 3)goto使用 4)变量延时读取 ...

  5. shell 脚本比较字符串相等_比较带空格的字符串相等的Shell脚本 如何比较两个.....

    ****************************比较带空格的字符串相等的Shell脚本*************************** 如果要比较的字符串中间有空格,可以用下面的程序(摘 ...

  6. bat递归查找指定文件_批处理脚本遍历指定文件夹下的文件

    批处理脚本 1. 遍历指定文件夹下的文件 1.1 命令解释 命令: for [参数] %%变量名 in (匹配符) do (执行的命令) 切记:每个指令之间必须以空格隔开,in 与 ( 之间有空格,d ...

  7. 实现android应用程序自动化测试的批处理脚本,简单入手移动端并发自动化测试:Appium+Robot+ 批处理脚本...

    一.前言 好久没写帖子,去年晋升为 leader 之后工作比较忙,去年为团队的产品建立了一轮的移动端(Android&iOS)的自动化测试,到今天为止跑了将近半年,前期感觉还行,但随着用例的增 ...

  8. android string拼接字符串_String对象的存储、拼接和比较

    一.String类型介绍 String类型是引用数据类型,表示字符串类型.String底层使用byte[]数组来存储char[]数组.(JDK1.9及以后的版本,JDK1.9之前是使用char数组保存 ...

  9. android string拼接字符串_「JAVA」细述合理创建字符串,分析字符串的底层存储,你不该错过...

    Java基础之字符串操作--String 字符串 什么是字符串?如果直接按照字面意思来理解就是多个字符连接起来组合成的字符序列.为了更好的理解以上的理论,我们先来解释下字符序列,字符序列:把多个字符按 ...

最新文章

  1. 如何学好机器学习数据挖掘?这本《数据分析数学基础》图文并茂带你学习入门...
  2. php error 2,一起搞懂PHP的错误和异常(二)
  3. CodeIgniter2.0中sqlserver驱动返回受影响行数问题解决
  4. Java并发编程的艺术(一)——并发编程需要注意的问题
  5. centos 7 构造iptables开放80port
  6. 错误MSB4018 “ResolvePackageAssets”任务意外失败的解决方法
  7. win10 radmin远程不了_不用QQ也能电脑远程,win10这隐藏功能太良心了!真后悔发现太晚...
  8. nvarchar转换为numeric时出错_Oracle转换Postgres
  9. 禁止用户通过shell登录
  10. Tensor:索引操作
  11. angular—— Dynamic Templates
  12. Linux Unix shell 编程指南学习笔记(第二部分)
  13. ARCGIS:软断裂线、硬断裂线、断层等名词和ARCGIS 如何操作
  14. 大话数据结构 —— 2.9 算法时间复杂度(合集)
  15. sqlserver创建函数后提示对象名无效
  16. python北京房价预测_《安家》热播,我用Python对北京房价进行了分析,结果……...
  17. 无货源开店已确认违法
  18. vue 全局、局部引入
  19. webpack 3/4踩坑,我太难了,从安装、卸载、到使用,各相应的版本号,sass-loader报错-版本的原因,webpack -v 不识别,没卸载干净...
  20. 如何撤销命令make install的安装结果,或者如何卸载Linux 库library ?

热门文章

  1. 快准牌电脑发软件_这些软件,电脑安装了,办公清理都比别人快几倍~~
  2. windows(xshell)免密码登录
  3. apache在win2003下的安全设置
  4. spring-cloud eureka注册发现
  5. 源自KPI交谈的思考
  6. Markdown基础语法小结
  7. 2016/12summary
  8. 异常宕机 Ora-00600 [Kccpb_sanity_check_2] 错误解决方法
  9. 高通平台gpio简单调试
  10. linux devm_request_irq 引发BUG sleeping function called from invalid context问题