Windows命令行脚本编写


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


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM