批处理(bat)命令学习的一些总结

2019-09-19 06:41:46刘景俊

findstr /x ".........." 1.txt
::查找1.txt中10字节的行
(type 1.txt&echo;)|findstr /o .*|more +1
::加上for,很容易获取1.txt每行的字节数
findstr>1.txt /m /p .* *.*
dir /b /a-d|findstr>2.txt /v /i /m /g:1.txt
::获取含有不可打印字符的文件名,关键是findstr取集
findstr "^Rar!" /g:1.txt
::此处1.txt是上个技巧的1.txt,内容是所有含不可打印字符的文件列表,此技巧可搜索rar文件,虽然简单,但是至今也未出错过,原创。
more>tmp +2 1.txt
findstr>前两行.txt /x /v /g:1.txt 2.txt
::有时候可用此办法获取前几行,当然,绝大部分情况下没有for /f合适,而且存在特殊字符bug
@echo off
findstr /n .* 1.txt>tmp1
find /n /v "" 2.txt|more>tmp2 +2
for /f "tokens=2*delims=]:" %%a in ('fc /n /lb10000 tmp1 tmp2^|sort') do (
echo;%%b
)
del tmp?
pause
::qzwqzw首创用fc /n同时输出双文本的思路,但是存在排序有可能被打乱的缺陷,所以加了个find弥补一下

四、start、call、cmd 篇

之所以放在一起,是因为这三个命令的功能有所交集
1、start
@echo off
%1 cd.>tmp
set /p=%1
%1 start /b "" %0 :(五秒后退出) tm
if not "%1"=="" goto %1
set /p n=输入任意字符
if defined n (
del tmp
echo 您输入的是%n%,五秒后退出。
) else echo 输入为空!五秒后退出。
:(五秒后退出)
ping /n 5 localhost>nul
if exist %2p exit
pause
::妙用start /b让set /p实现choice的延时功能,不知道哪位前辈首创的,再次赞一个。此处%1、%2的技巧仅作点缀,我只是觉得这样“搭积木”很好玩才强加上去的。
2、call
set a=b
set b=c
call echo %%%a%%%
::不使用变量延迟仍然可以借助call实现变量的延迟读取与嵌套,但是效率上有缺陷
3、cmd
set a=b
set b=c
cmd /c echo %%%a%%%
::这证明call一个命令时的效果近似于cmd /c,二者的区别体现在"for"和"if"这两个命令不能用call运行,因为for和if其实可能只是关键字,而非真实存在的命令
set a=b
set b=c
cmd /v:on /c echo !%a%!
::不需要setlocal,照样可以使用变量延迟
%1 %0 :: echo;成功调用自身
%2
::个人很常用,这里用%1和%2的技巧为我所偏爱,那个::可以视情况换为rem。虽然此处并未出现cmd命令,但其实运行自身时执行的就是cmd /c %0。
@echo off
%1 cmd /v:on /c %0 ::
set n=123
echo !n!
pause
::综合前两个技巧实现不使用setlocal,开启变量延迟
@echo off
set str=test测试1234
setlocal enabledelayedexpansion
for /f "delims=:; " %%a in ('((cmd /u /c echo !str!^)^&echo^;^;^)^|findstr /o ^;') do set /a n=%%a-5
for /f "delims=:" %%a in ('((echo !str!^)^&echo^;^;^)^|findstr /o ^;') do set /a d=n-%%a+3

相关文章 大家在看