1、setlocal、endlocal 命令
SETLOCAL
[ENABLEEXTENSIONS | DISABLEEXTENSIONS] [ENABLEDELAYEDEXPANSION | DISABLEDELAYEDEXPANSION]
用法1:变量只在 setlocal 到 endlocal 范围内有效
@echo off
setlocal
set var=hahahah
echo %var%
endlocal
echo ========================
echo %var%
结果:
E:\workspaceForBat>11.setlocal.bat
hahahah
========================
ECHO 处于关闭状态。
用法2:如果变量支持拓展的话,setlocal disableextensions 会禁止变量的拓展写法
@echo off
for %%i in (*.txt) do echo %%i %%~ti %%~zi
echo =================
setlocal disableextensions
for %%i in (*.txt) do echo %%i %%~ti %%~zi
setlocal enableextensions
输出:
E:\workspaceForBat>11.setlocal.bat
1.txt 2018-12-17 20:51 0
=================
1.txt %~ti %~zi
用法3:禁止/启用变量延迟,该用法常常用在一组组合命令中,例如下面
@echo off
setlocal disabledelayedexpansion
for /l %%i in (1,1,5) do (
set var=%%i
echo %var%
)
setlocal enabledelayedexpansion
echo =================
setlocal enabledelayedexpansion
for /l %%i in (1,1,5) do (
set var=%%i
echo %var%
)
setlocal disabledelayedexpansion
命令行解释器会把
for /l %%i in (1,1,5) do (
set var=%%i
echo %var%
)
看做一个整体,然而变量在命令行中是一组一组(一行一行)解释的,这个时候 set var=%%i,变量 i 还没有值,所以会出现取不到值的情况,禁用变量延迟就能解决这个问题了
2、shift 命令
SHIFT [/n] ,看下面的 demo 就会明白了,/n 参数有值的话取值范围是 0-8
@echo off
rem 12 13 15 16 18
echo %1
rem shift 执行一下,所有参数往前移动一位,移动后是 13 15 16 18
shift
rem 13 15 16 18
echo %4
shift
rem 15 16 18
echo %1
rem 把第 2 个参数干掉,其他的往前移
shift /2
rem 15 16 18
echo %2
运行输出:
E:\workspaceForBat>12.shift.bat 12 13 15 16 18
12
18
15
18
3、type 命令
TYPE [drive:][path]filename 输出文件的所有内容
4、find 命令
FIND [/V] [/C] [/N] [/I] [/OFF[LINE]] “string” [[drive:][path]filename[ …]]
参数 | 解释 |
---|---|
/V | 显示所有未包含指定字符串的行 |
/C | 仅显示包含字符串的行数 |
/N | 显示行号 |
/I | 搜索字符串时忽略大小写 |
/OFF[LINE] | 不要跳过具有脱机属性集的文件 |
“string” | 指定要搜索的文本字符串 |
[drive:][path]filename | 指定要搜索的文件 |
测试: |
@echo off
echo ==================普通查找
find "FG" 1.txt
echo ==================显示所有未包含指定字符串的行
find /v "FG" 1.txt
echo ==================仅显示包含字符串的行数
find /c "FG" 1.txt
echo ==================显示行号
find /n "FG" 1.txt
echo ==================搜索字符串时忽略大小写
find /i "FG" 1.txt
echo ==================不要跳过具有脱机属性集的文件
find /OFF "FG" 1.txt
输出:
E:\workspaceForBat>13.find.bat
==================普通查找
---------- 1.TXT
ABCDEFG
==================显示所有未包含指定字符串的行
---------- 1.TXT
abcdefg
==================仅显示包含字符串的行数
---------- 1.TXT: 1
==================显示行号
---------- 1.TXT
[2]ABCDEFG
==================搜索字符串时忽略大小写
---------- 1.TXT
abcdefg
ABCDEFG
==================不要跳过具有脱机属性集的文件
---------- 1.TXT
ABCDEFG
5、findstr 命令
FINDSTR
[/B] [/E] [/L] [/R] [/S] [/I] [/X] [/V] [/N] [/M] [/O] [/P] [/F:file]
[/C:string] [/G:file] [/D:dir list] [/A:color attributes] [/OFF[LINE]]
strings [[drive:][path]filename[ …]]
参数说明不写了,自己用 cmd 执行 help findstr 看吧,写出来也没意义
==最普通的方式,一整行搜索
D:\workspaceForBat>findstr "333" 1.txt
;222 22 5555 333 22 22 22 22 22
2 22 444 333
333 2 22 444
测试文本 这是测试文本 字符 啊咧 23333
==在一行的开始配对模式,如果开头没有匹配到就忽略该行
D:\workspaceForBat>findstr /b "333" 1.txt
333 2 22 444
==在一行的结尾配对模式,如果结尾没有匹配到就忽略该行
D:\workspaceForBat>findstr /e "333" 1.txt
2 22 444 333
测试文本 这是测试文本 字符 啊咧 23333
==按字使用搜索字符串,按照每个符号精确匹配,正则等模糊匹配的符号将会禁止
D:\workspaceForBat>findstr /l "*333" 1.txt
==最普通的方式,一整行搜索
D:\workspaceForBat>findstr "111*" 1.txt
7777777 111111 111111 111111 111111 111111 666666
11
==将搜索字符串作为正则表达式使用
D:\workspaceForBat>findstr /r "111*" 1.txt
7777777 111111 111111 111111 111111 111111 666666
11
==在当前目录和所有子目录中搜索匹配的文件 1.txt 并在所有匹配的文件中搜索 111*
D:\workspaceForBat>findstr /s "111*" 1.txt
1.txt:7777777 111111 111111 111111 111111 111111 666666
1.txt:11
文 件 夹 1\1.txt:111111 111111 111111 111111 111111
==完全匹配的查找
D:\workspaceForBat>findstr /x "11" 1.txt
11
==完全匹配的查找
D:\workspaceForBat>findstr /x "1@1" 1.txt
1@1
==完全匹配的查找
D:\workspaceForBat>findstr /x "asdf" 1.txt
asdf
==完全匹配的查找,不知为何有空格就找不到
D:\workspaceForBat>findstr /x "jfjfjf jfjfjf" 1.txt
==完全匹配的查找,中文也不行
D:\workspaceForBat>findstr /x "这是一串很长的字符串" 1.txt
这是一串很长的字符串
==普通查找
D:\workspaceForBat>findstr "符串" 1.txt
这是一串很长的字符串
==如果文件含有匹配项,只打印其文件名
D:\workspaceForBat>findstr /m "11" 1.txt
1.txt
==从指定文件读文件列表
D:\workspaceForBat>findstr /f:1.txt "符串"
FINDSTR: 无法打开 7777777 111111 111111 111111 111111 111111 666666
FINDSTR: 无法打开 ;222 22 5555 333 22 22 22 22 22
FINDSTR: 无法打开 11
FINDSTR: 无法打开 1@1
FINDSTR: 无法打开 asdf
FINDSTR: 无法打开 jfjfjf jfjfjf
FINDSTR: 无法打开 2 22 444 333
FINDSTR: 无法打开 333 2 22 444
FINDSTR: 无法打开 测试文本 这是测试文本 字符 啊咧 23333
FINDSTR: 无法打开 这是一串很长的字符串
1.txt:这是一串很长的字符串
==从3这个文件中读取出来要搜索的文字(以行分开),然后在 2.txt 中搜索
D:\workspaceForBat>findstr /g:3 "2.txt"
FOR /F "skip=1 eol=; tokens=2,3,6-9 delims= " %%i in (1.txt) do @echo %%i %%j %%k
33333
aaaaaa aaaaaa
aaaaaaaaa
文件 1.txt 内容
7777777 111111 111111 111111 111111 111111 666666
;222 22 5555 333 22 22 22 22 22
11
1@1
asdf
jfjfjf jfjfjf
2 22 444 333
333 2 22 444
测试文本 这是测试文本 字符 啊咧 23333
这是一串很长的字符串
1.txt
文件 3 内容:
aaaa
FOR
33
文件 2.txt 内容
这是2.txt的内容 这是2.txt的内容 这是2.txt的内容
这是2.txt的内容 这是2.txt的内容 这是2.txt的内容 这是2.txt的内容
@echo off
FOR /F "skip=1 eol=; tokens=2,3,6-9 delims= " %%i in (1.txt) do @echo %%i %%j %%k
for %%a in (*.txt) do echo %%~ta
4.txt
33333
aaaaaa aaaaaa
aaaaaaaaa
其他命令用法类似,貌似没什么特别的了