1. 路径获取
@echo off
echo 当前盘符:%~d0
c:
echo 当前盘符和路径:%~dp0
c:\tmp\
echo 当前批处理文件路径:%~f0
c:\tmp\test.bat
echo 文件本身: %0
test.bat
echo 文件扩展名: %~x0
.bat
echo 文件名(无扩展名): %~n0
test
echo 当前盘符和路径的短文件名格式:%~sdp0
c:\tmp\
echo 当前CMD默认目录:%cd%
c:\tmp\
PS: 目录中如果有空格, 可以用""包起来, 避免找不到路径
pause

2. 函数定义和使用

1. 函数定义
:myDosFunc    - 函数的开始,用一个标签标识
echo. 函数体,可以执行很多命令
echo. 
GOTO:EOF    - 函数的结束.
2. 函数调用
call:myDosFunc arg1 arg2 arg3
多个参数可以用空格或逗号隔开
3. 返回值
用IF ERRORLEVEL 0-255 来判断执行结果;
或者, 用传递给函数的参数作为返回值;
或者, 用全局变量作为返回值;

3. 字符串操作

1. 字符串截取
%a:~[m[,n]]%
a为变量名,符号~可以简单理解为“偏移”即可,m为偏移量(缺省为0),n为截取长度(缺省为全部)
@echo off
set a=bbs.verybat.cn
set var=%a:~1,2%
echo %var%
pause
2. 字符串替换
%var:str1=str2%
将字符串变量%var%中的str1替换为str2
@echo off
set a= bbs. verybat. cn
echo 替换前的值: "%a%"
set var=%a: =%
echo 替换后的值: "%var%"
pause

4. 获取ProcessId

set cmd=wmic process where "name='程序名' and commandline like '%关键字%'" get ProcessId /format:list
    for /F "usebackq delims== tokens=1,2*" %%i in (`%cmd%`) do (
	    if "%%i"=="ProcessId" (
               echo %%j
	    )
    )

5. 新窗口运行程序, 并获取ProcessId

setlocal enabledelayedexpansion
for /F "usebackq tokens=1,2 delims=;=%tab% " %%i in (
      `wmic process call create "%cmd%"^, "%dir%"`
    ) do (
      for /F "tokens=*" %%I in ("%%i") do (
        if /I %%~nxI EQU ProcessId (
            for /F "tokens=*" %%J in ("%%j") do (
              echo %%~nxJ
          )
        )
      )
    )

6. 判断和循环中变量赋值问题

写批处理脚本时, 在if和for中经常遇到变量赋值无效的问题. (什么原因未究)
可以通过延迟表达式的方式处理.
首先要设置: setlocal enabledelayedexpansion
然后将%改成!
@echo off
setlocal enabledelayedexpansion

set args=
for /f %%i in (args.txt) do (
    set args=!args! %%i
)

7. 读取属性文件

setlocal enabledelayedexpansion
call:export_envs 属性文件

:export_envs
  for /f "eol=# tokens=*" %%a in (%1) do (
    @rem echo.
    @rem 去除行尾注释。取%%m,舍弃%%n
    for /f "delims=# tokens=1*" %%m in ("%%a") do (
      @rem 解析配置,去掉空行。取%%x,%%y,舍弃%%z
      for /f "delims== tokens=1,2*" %%x in ("%%m") do (
        if not "%%y"=="" (
          @rem 去掉 配置项 的空白字符。
          for /f %%k in ("%%x") do (
            @rem 去掉 配置值 的空白字符。
            for /f "tokens=1*" %%v in ("%%y") do (
              set val=%%v
              if not "%%w"=="" (
                set val=%%v %%w
              )
              if not "%%n"=="" (
                  set val=!val!#%%n
              )
              if not "%%z"=="" (
                  set val=!val!=%%z
              )
              echo .%%k.=.!val!.
              set %%k=!val!
            )
          )
        )
      )
    )
  )
GOTO:EOF

99. 打印彩色内容

@echo off
cls
echo  STYLES 
echo ^<ESC^>[0m Reset
echo ^<ESC^>[1m Bold
echo ^<ESC^>[4m Underline
echo ^<ESC^>[7m Inverse
echo.
echo  NORMAL FOREGROUND COLORS 
echo ^<ESC^>[30m Black (black)
echo ^<ESC^>[31m Red
echo ^<ESC^>[32m Green
echo ^<ESC^>[33m Yellow
echo ^<ESC^>[34m Blue
echo ^<ESC^>[35m Magenta
echo ^<ESC^>[36m Cyan
echo ^<ESC^>[37m White
echo.
echo  NORMAL BACKGROUND COLORS 
echo ^<ESC^>[40m Black
echo ^<ESC^>[41m Red
echo ^<ESC^>[42m Green
echo ^<ESC^>[43m Yellow
echo ^<ESC^>[44m Blue
echo ^<ESC^>[45m Magenta
echo ^<ESC^>[46m Cyan
echo ^<ESC^>[47m White (white)
echo.
echo  STRONG FOREGROUND COLORS 
echo ^<ESC^>[90m White
echo ^<ESC^>[91m Red
echo ^<ESC^>[92m Green
echo ^<ESC^>[93m Yellow
echo ^<ESC^>[94m Blue
echo ^<ESC^>[95m Magenta
echo ^<ESC^>[96m Cyan
echo ^<ESC^>[97m White
echo.
echo  STRONG BACKGROUND COLORS 
echo ^<ESC^>[100m Black
echo ^<ESC^>[101m Red
echo ^<ESC^>[102m Green
echo ^<ESC^>[103m Yellow
echo ^<ESC^>[104m Blue
echo ^<ESC^>[105m Magenta
echo ^<ESC^>[106m Cyan
echo ^<ESC^>[107m White
echo.
echo  COMBINATIONS 
echo ^<ESC^>[31m                     red foreground color
echo ^<ESC^>[7m                      inverse foreground ^<-^> background
echo ^<ESC^>[7;31m                   inverse red foreground color
echo ^<ESC^>[7m and nested ^<ESC^>[31m before nested
echo ^<ESC^>[31m and nested ^<ESC^>[7m before nested

发表评论

邮箱地址不会被公开。 必填项已用*标注