本篇文章已授权微信公众号 dasu_Android(大苏)独家发布
这次打算写几篇关于脚本方面的博客,主要是记录一下 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:表示获取该文件的大小
3.5 截取某个指定字符前的部分
其他语言对字符串的处理基本都有类似 indexof 方法,在批处理中,可以用 for 语句对字符串进行处理来达到这种效果。
示例:
set name=woshidasusu_android
for /f "delims=_" %%i in ('echo %name%') do (
echo %%i
)
输出:woshidasusu
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 命令来执行签名工作。
这个场景,刚好把我们今天学的关于批处理的遍历文件夹操作、临时变量使用、字符串的处理三者都包括在内,感兴趣的也去试试看吧~
最近(2018-03)刚开通了公众号,想激励自己坚持写作下去,初期主要分享原创的Android或Android-Tv方面的小知识,准备可能还有点不足,感兴趣的可以先点一波关注,谢谢支持~~
写个批处理脚本来帮忙干活--遍历文件夹&字符串处理的更多相关文章
-
java学习笔记——IO部分(遍历文件夹)
用File类写的一个简单的工具,遍历文件夹,获取该文件夹下的所以文件(含子目录下的文件)和文件大小: /** * 列出指定目录下(包含其子目录)的所有文件 * @author syskey * */ ...
-
写完批处理脚本,再写个Gradle脚本,解放双手
前言 上一篇写个批处理来帮忙干活---遍历&字符串处理中,我们已经学习如何写批处理脚本来帮我们做一些简单的重复性工作,本篇继续来学习如何用 Gradle 写脚本,让它也来帮我们干活 Gradl ...
-
Python高效率遍历文件夹寻找重复文件
前言 为什么要写这篇文章呢...主要还是业务中有个需求,遍历一个将近200w数据的文件夹,大部分还都是视频文件那种,但是这玩意用的次数还不多,做文件夹index也不是很ok,所以写了一个脚本来处理这个 ...
-
Java多线程遍历文件夹,广度遍历加多线程加深度遍历结合
复习IO操作,突然想写一个小工具,统计一下电脑里面的Java代码量还有注释率,最开始随手写了一个递归算法,遍历文件夹,比较简单,而且代码层次清晰,相对易于理解,代码如下:(完整代码贴在最后面,前面是功 ...
-
原生js 遍历文件夹分析xml并保存
其实这种功能,网上相关的代码多的是,我也是因为今天正好要用到这个功能,所以临时写了下,放这里保存下,以便将来自己或者别人用的上吧. 当然我写的是一个hta文件.下面是完整js代码,都是调用active ...
-
python os.walk()遍历文件夹
转自 http://alanland.iteye.com/blog/612459 via @alanland 今天第一次进行 文件遍历,自己递归写的时候还调试了好久,(主要因为分隔符号的问题),后来发 ...
-
C# 遍历文件夹筛选目标文件
有近400G的数据,首先需要写程序把目标文件标准化名称(相当耗时,各种情形,间接说明在数据采集过程中标准化操作的重要性,这样会给后续处理带来很多不必要的麻烦和消耗) 网上找了个方法还不错,还有一种递归 ...
-
HDFS 读取、写入、遍历文件夹获取文件全路径、append
版权声明:本文为博主原创文章,未经博主同意不得转载.安金龙 的博客. https://blog.csdn.net/smile0198/article/details/37573081 1.从HDFS中 ...
-
c bash 代码遍历文件夹下所有文件
用C代码.bash实现代码遍历文件夹下所有文件 递归方式实现如下: void listdir(char *path) { DIR *ptr_dir; struct dirent *dir_entry; ...
随机推荐
-
redis主从 以及认证配置
以前用redis用的很多,各种数据类型用的飞起,算是用得很溜了.不过那都是封装好的方法,自己直接调用.以前的公司比较规范,开发只是开发,很少去做跟运维相关的事情. 换了一份工作,不过这边项目刚开始起步 ...
-
关于PHP的curl开启问题
今天在做一个新浪登录功能,新浪提供的PHP SDK里需要用到curl_init()函数,在调试的时候报找不到curl_init()的方法. 经搜索得知需要开启curl的php扩展,那curl又是什么呢 ...
-
[转] 在Linux平台使用mhVTL虚拟化磁带库
原文来自:LIUBINGLIN ---- http://blog.itpub.net/23135684/viewspace-1307626/ <在Linux平台安装mhVTL虚拟化磁带库> ...
-
让Fiddler能够检测到localhost的http数据
用 vs.net开发调试网站程序时经常有这样的地址: http://localhost:2033/ 然而在开启 Fiddler 后会发现Fiddler 完全抓不到任何封包. 主要的原因是因为 Fidd ...
-
纯css实现扁平化360卫士logo demo
前几天在w3ctech上看到有人用纯css写出了360卫士的logo,感觉蛮好玩的. 因为自己用css以来,还没有写过这种玩意,出于娱乐,我也来试着尝试一下. 开始也不知到怎么下手,最棘手的是那两个像 ...
-
BitmapImage 读取内存流和显示图片
FileStream filestream = File.OpenRead(@"C:\Users\Administrator\Desktop\queryHeaderImg.png" ...
-
Hadoop部署配置文件
为了方便大家修,我把要修改的地方标红了,找到对应文件,复制粘贴过去就可以了 注:这个是我安装的Hadoop的配置,要根据我之前发的文章配置才行, 里面有一些东西比如文件夹名称,路径不一样,稍加修改也可 ...
-
vlog.hpp
//vov #ifndef VLOG_HPP #define VLOG_HPP #include <sys/time.h> #include <unistd.h> #ifnde ...
-
快速熟悉Matlab
一 获取数组长度: d = size(X) [m,n] = size(X) m = size(X,dim) [d1,d2,d3,...,dn] = size(X) 二 注释和取消注释. 点击ctrl ...
-
Qt5获取本机网络信息
获取本机网络信息 在pro文件中加入如下代码 QT += network widget.h中的代码如下 #ifndef WIDGET_H #define WIDGET_H #include <Q ...