windows下的bat编写经验笔记

4 篇文章 0 订阅
1 篇文章 0 订阅

平时用得最多的还是windows,

快速批量执行某些操作,还是需要有的.

所以.想方便,有时还是得写个bat来运行.

这就需要bat的语法了.

但是bat的语法就像之前的vb风格,有点难明白,不想js,php之类这么易用.

这里的经验可能很乱,但是我只写一下我遇到的问题,是经过测试才明白的,且直接 命令 /?是看不出来的那种,才值得说.

后面会不停的补充


1. 怎么方便的从一串字符中分析出目录/基本文件名/后缀名?

set kkk=c:\qidizi\kdkdkkd.qdz
echo off
call :spli "%kkk%"
goto :EOF
exit

:spli
	set fp=%~1
	set dp=%~dp1
	set pbn=%~n1
	set px=%~x1
	echo.
	echo "%fp%" "%dp%" "%pbn%" "%px%"
	goto :EOF
:eof_spli

call后,

 结果

"c:\qidizi\kdkdkkd.qdz" "c:\qidizi\" "kdkdkkd" ".qdz"


2. switch与default式的实现

原理是把所有的拼上,call失败它会设置

:ch
title 选择操作
set called=0
 set ch=exit
echo 工具箱
echo.
echo 序号 对应任务
echo.
echo 1 adb
echo 2 logcat
echo 3 重启
echo 4 上传文件
echo 5 签名
echo 6 安装apk
echo 7 卸载apk
echo 8 反编AndroidManifest.xml
echo 9 odex转apk包内classes.dex
echo 其它 退出
echo.
echo 请输入上面序号数字后,回车即可完成操作的选择
echo.
set /p ch=
:eof_ch
cls
set /a ch*=1
call :callLabel%ch%
IF %called% EQU 1 goto ch
echo.
echo 本程序即将退出...稍息自动关闭窗口
ping 127.0.0.1 -n 2 >nul
GOTO :EOF
exit

:callLabel2
  set called=1
  goto :EOF
:eof_callLabel2

3 延时

因为bat是一行一行解释的,

ping 127.0.0.1 -n 3 >nul

延时大概是3秒?一ping花一秒?


4 验证是否有某功能,且不导致bat出错退出

call :javaTest
goto eof_javaTest

:javaTest
set ea=%ERRORLEVEL%
echo 运行环境值当前是:%ea% 
java.exe -version
set eb=%ERRORLEVEL%
echo 测试java环境后,运行环境值是:%eb%

if %ea% EQU %eb% (
	cls
	goto :EOF
) else (
	echo 运行环境测试前后不同[java出错影响]:%ea% != %eb%
	echo 证明没有java环境,无法进行签名,请安装java再使用
)
goto :EOF
:eof_javaTest

5 func形态? 那就是上面的call :xxx,可以多次调用,只是编写时,注意goto ,别死在那里即可,func结束时别用exit,要用goto :EOF,这是退出call层,但是不会中止bat


6 判断某句运行结果?

echo 查找是否有处于recovery状态的手机
%adb% devices|find "recovery"
echo 结果意义:
echo 0: 表示,有此状态的手机连结着;
echo 1: 表示,无此状态的手机;
echo 查找结果:
echo %ERRORLEVEL%

if %ERRORLEVEL% EQU 0 (
	echo.
	echo 发现有手机处于recovery模式,进入上传步骤
	goto startUpload
)

echo 未找到处于recovery状态的手机
echo.
还有就是运行完命令后,直接检测环境变量
 %ERRORLEVEL%

如果在环境变量不保证情况下,

可以使用像下面检测文件还是目录方式,findstr+for


7 换行(空行)

echo.

注意echo 不能直接写换行,只能后面跟紧个句点号.


8 if 与 for之类的块代码

if "ddd" == "" (

 echo 都是 if中

ecoh 也是if中

) else (

)

注意 (的左边必须跟着上行,else不能换行写

(

 这里不能再写(),否则解析时,会使用紧跟的,

)

if "" == "" (
    echo (ddd)
) else (
    echo a
)
echo b


第一句只出来 (ddd,非(ddd)


9 比较非空字符 if "%input%" == ""


10 变量赋值 set var=,注意=号紧跟变量名


11 set /p input=直接回车,并不会改变input的值

:re
set /p input=
echo %input%
goto re

第一轮输入 loop1

出来loop1

第二轮直接回车.

还是出来loop1

可以

set input=

set /p input=

来防止


12

 在cmd中直接输入时for使用一个%,

for /F "usebackq" %i in (`dir`) do echo %i

放到bat时,得二个%

for /F "usebackq" %%i in (`dir`) do echo %%i

13

for 的引号是与~同一键的符号,非''单引,或是""双引

for /F "usebackq" %%i in (`dir`) do echo %%i

14

for 的块代码如下,也是(紧跟

for /F "usebackq" %%i in (`dir`) do (

   echo %%i

)

15

判断给出的字符串是一个文件还是一个目录路径


直接测试
C:\Users\Administrator\Desktop\android\bin>for /f "usebackq" %i in (`dir "%cd%\adb.exe" /b /a:-d /s^|findstr /i /p /x /b /l /n "%cd%\adb.exe"`) do echo 是文件
C:\Users\Administrator\Desktop\android\bin\adb.exe
1:C:\Users\Administrator\Desktop\android\bin\adb.exe

C:\Users\Administrator\Desktop\android\bin>echo 是文件
是文件

注意|符号需要^来转义


bat中使用

:re
set /p s=
call :isFile "%s%"
if %isFile% EQU 1 (
	echo 是文件
) else (
	echo 是目录
)
goto re
:isFile
	set p=%~f1
	set isFile=0	
	for /f "usebackq" %%i in (`dir "%p%" /b /a:-d /s^|findstr /i /p /x /b /l /n "%p%"`) do set isFile=1
goto :EOF


10 判断输入 set /p input=,并给新的变量,这里不能直接写 set n=%input%,因为bat对特殊字符处理不好.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值