upd
老掉牙的玩意,powershell是windows下更好的脚本语言
建议右转powershell
说明
用来提高工作效率
cmd里面help findstr
啥用法都出来了
常用的命令
:: 我是注释
exitst 检查文件,符号是否存在,注意空字符串判断不存在
defined 检查变量是否定义
find、findstr 文本搜索命令
cd cd不能直接切换到某个位置,用pushd即可
pushd
popd
exit 退出脚本
more 显示模式
sort
call 本窗口调用
start 新开窗口调用
md mkdir 新建文件夹
echo=>1.txt 新建文件
echo. 输出换行
dir 显示所有文件
dir /b 纯文件名
ren 1.txt 2.txt 改名字
for %%i in (...) do ( //空格必须打,否则解析失败
...
)
系统常识
批处理对命令格式很敏感,比如多一个空格少一个空格都影响很大
当你学习的时候,发现一模一样的批处理命令运行不了,一般就是细节不会,比如
in(*.*)不合法
in (*.*)合法
延迟扩展
执行完一条语句,才对变量重新赋值
@echo off
set a=4
set a=5&echo %a% // 这里输出 4,因为运行到这条语句时,a采用上一条语句运行完的值
pause
关闭延迟
@echo off
setlocal enabledelayedexpansion // 写上该语句
set a=4
set a=5&echo !a! // 同时,采用 !a! ,%a%保持延迟
pause
强化实践,输出1 2 3 4 5
@echo off
setlocal enabledelayedexpansion
for /l %%i in (1,1,5) do (
set a=%%i
echo !a!)
pause
@echo off // 这样也可以,因为for中的i是不延迟的
for /l %%i in (1,1,5) do (
echo %%i)
pause
关系运算符,不区分大小写
EQU - 等于
NEQ - 不等于
LSS - 小于
LEQ - 小于或等于
GTR - 大于
GEQ - 大于或等于
%0 代表批处理文件的路径
%1 ~ %9 传递进来的1-9个参数 // call指令可以调用别的批处理并传递参数
echo. 换行
echo %PATH% 输出环境变量
echo %DATE%
echo %RANDOM% 输出一个随机数
echo %TIME%
echo %num%
set /p num=input a number:
ERRORLEVEL 调用完命令后可以通过ERRORLEVEL拿到返回值、错误码
REM 我是注释
con 屏幕
nul 空设备
prn 打印机
>> 产生的内容将追加进文件中
> 则将原文件内容覆盖
< 输入重定向
<<代表当前标准输入来自命令行的一对分隔号的中间内容
& 顺序执行多条命令,而不管命令是否执行成功
&& 顺序执行多条命令,当碰到执行出错的命令后将不执行后面的命令
|| 顺序执行多条命令,当碰到执行正确的命令后将不执行后面的命令(即:只有前面命令执行错误时才执行后面命令)
| 管道命令 前一个命令的执行结果输出到后一个命令 如:help|more
字符串操作
正则表达式
. 通配符: 任何字符
* 重复: 以前字符或类出现零或零以上次数
^ 行位置: 行的开始
$ 行位置: 行的终点
[class] 字符类: 任何在字符集中的字符
[^class] 补字符类: 任何不在字符集中的字符
[x-y] 范围: 在指定范围内的任何字符
\x Escape: 元字符 x 的文字用法
\<xyz 字位置: 字的开始
xyz\> 字位置: 字的结束
基本的字符串操作
截取
@echo off
// echo %str:~pos,len%
set str=abcdefg123456789
echo %str%
echo %str:~3,1%
echo %str:~,-5%
pause
字符串替换
@echo off
set str=hello,mzb,mzb,aaaaa
echo %str%
echo %str:aa=bb%
pause
拼接
@echo off
set str=hello
set mzb=mzb
echo %str%,%mzb%
pause
其他命令
findstr
strlen 莫得库函数,得自己实现
@echo off
set /p str=Input:
if not defined str goto :eof
set num=0
:label
set /a num+=1
set str=%str:~,-1%
if defined str goto :label
echo %num%
pause
既定
if
goto end
:end
goto :eof
直接退出
用户选择 + if
@echo off
choice /C dme /M "defrag,mem,end"
if errorlevel 3 goto end
if errorlevel 2 goto mem
if errotlevel 1 goto defrag
:defrag
c:\dos\defrag
goto end
:mem
mem
goto end
:end
pause
普通if
@echo off
set a="123.txt"
if exist %a% (
echo file exist
) else (
echo file not found
)
pause
for
注意for (str)的时候,会按空格或者,分割字符串然后执行
@echo off
for %%c in (*.bat,*.txt) do (type %%c)
pause
for /D %%i in (*) do echo %%i 显示文件夹
for /L %%i in (1,1,100) do echo %%i 范围for
for /R %%i in ([路径]) do echo %%i 枚举路径下的所有文件夹
for /F
是用来处理文本的,所以花样比较多
指定分割符
for /f "delims=.," %%i in (test.txt) do echo %%i 按'.'或者','切割字符串
for /f 简单来说,默认每行按分隔符分割成一个,单词数组(下标从1开始),然后默认返回每行第1个单词
定点提取
for /f "tokens=3" %%i in (123.txt) do echo %%i 输出每行第3个单词
tokens=2,3
tokens=2-3,5
tokens=2,* 1丢弃,%a = 2,%b = 剩下的
for /f "tokens=3,4" %%i in (123.txt) do echo %%i %%j
%%i,%%j,%%k分别接受tokens=3,4...
for /f "tokens=3,4" %%a in (123.txt) do echo %%a %%b
%%a,%%b,%%c...按顺序走就行了
跳过前n行
for /f "skip=2 tokens=2" %%i in (123.txt) do echo %%i 跳过前n行
过滤以;开头的行
for /f "eol=; tokens=1" %%i in (123.txt) do echo %%i
处理"123 123.txt"无法识别的问题
for /f "usebackq" %%i in ("test 1.txt") do echo %%i