DOS编程
- 路径获取
@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 [101;93m STYLES [0m
echo ^<ESC^>[0m [0mReset[0m
echo ^<ESC^>[1m [1mBold[0m
echo ^<ESC^>[4m [4mUnderline[0m
echo ^<ESC^>[7m [7mInverse[0m
echo.
echo [101;93m NORMAL FOREGROUND COLORS [0m
echo ^<ESC^>[30m [30mBlack[0m (black)
echo ^<ESC^>[31m [31mRed[0m
echo ^<ESC^>[32m [32mGreen[0m
echo ^<ESC^>[33m [33mYellow[0m
echo ^<ESC^>[34m [34mBlue[0m
echo ^<ESC^>[35m [35mMagenta[0m
echo ^<ESC^>[36m [36mCyan[0m
echo ^<ESC^>[37m [37mWhite[0m
echo.
echo [101;93m NORMAL BACKGROUND COLORS [0m
echo ^<ESC^>[40m [40mBlack[0m
echo ^<ESC^>[41m [41mRed[0m
echo ^<ESC^>[42m [42mGreen[0m
echo ^<ESC^>[43m [43mYellow[0m
echo ^<ESC^>[44m [44mBlue[0m
echo ^<ESC^>[45m [45mMagenta[0m
echo ^<ESC^>[46m [46mCyan[0m
echo ^<ESC^>[47m [47mWhite[0m (white)
echo.
echo [101;93m STRONG FOREGROUND COLORS [0m
echo ^<ESC^>[90m [90mWhite[0m
echo ^<ESC^>[91m [91mRed[0m
echo ^<ESC^>[92m [92mGreen[0m
echo ^<ESC^>[93m [93mYellow[0m
echo ^<ESC^>[94m [94mBlue[0m
echo ^<ESC^>[95m [95mMagenta[0m
echo ^<ESC^>[96m [96mCyan[0m
echo ^<ESC^>[97m [97mWhite[0m
echo.
echo [101;93m STRONG BACKGROUND COLORS [0m
echo ^<ESC^>[100m [100mBlack[0m
echo ^<ESC^>[101m [101mRed[0m
echo ^<ESC^>[102m [102mGreen[0m
echo ^<ESC^>[103m [103mYellow[0m
echo ^<ESC^>[104m [104mBlue[0m
echo ^<ESC^>[105m [105mMagenta[0m
echo ^<ESC^>[106m [106mCyan[0m
echo ^<ESC^>[107m [107mWhite[0m
echo.
echo [101;93m COMBINATIONS [0m
echo ^<ESC^>[31m [31mred foreground color[0m
echo ^<ESC^>[7m [7minverse foreground ^<-^> background[0m
echo ^<ESC^>[7;31m [7;31minverse red foreground color[0m
echo ^<ESC^>[7m and nested ^<ESC^>[31m [7mbefore [31mnested[0m
echo ^<ESC^>[31m and nested ^<ESC^>[7m [31mbefore [7mnested[0m