DOS Batch 编程
Table of Contents
1 编程范式
@echo off setlocal EnableExtensions set HERE=%~dp0 set DRIVER=%~d0 rem coding... :DONE endlocal echo on exit /b 0
2 定义函数
Batch 脚本中没有函数,可以使用符号模拟的方式来创建
- 定义的函数一定要写在脚本最后
- 需要通过
call
来模拟函数调用
call :GetDateTime time0 call :Sleep 10 call :GetDateTime time1 echo %time0% echo %time1% :DONE endlocal echo on exit /b 0 :GetDateTime set DATETAG=%date:~0,4%-%date:~5,2%-%date:~8,2% set TIMETAG=%time:~0,2%:%time:~3,2%:%time:~6,2% set HOUR=%time:~0,2% if /i %HOUR% lss 10 (set TIMETAG=0%time:~1,1%:%time:~3,2%:%time:~6,2%) set %~1=%DATETAG% %TIMETAG% exit /b 0 :Sleep ping -n %~1 127.0.0.1 >nul 2>&1 exit /b 0
3 获取返回值
Batch 脚本通过 %ERRORLEVEL%
变量获取,常见的代码片段如下
execute.exe set RETCODE=0 if /i %ERRORLEVEL% neq 0 (set RETCODE=%ERRORLEVEL%)
4 定义多行字符串
可以使用 ^
符号来对长字符串进行折行
echo long text without^
new line terminated, folding^
with ^^ symbol
上述命令执行结果如下
D:\Code> echo long text without^ More? new line terminated, folding^ More? with ^^ symbol long text withoutnew line terminated, foldingwith ^ symbol
5 遍历传入的命令行参数
这里使用到
shift
来移动传入的参数- 通过跳转来模拟循环
@echo off :Loop if "%1"=="" goto EndLoop for %%a in (%1) do echo %%a shift goto Loop :EndLoop
需要注意的是当传入的参数包含 "
时,判断空字符串可以考虑以下形式
if [%1]==[] goto EndLoop
6 常见功能
获取当前机器 IP
for /f "delims=[] tokens=2" %%a in ('ping %computername% -4 -n 1 ^| findstr "["') do (set IPSTR=%%a)
获取当前主机名称
for /f %%a in ('hostname') do set HOSTSTR=%%a
统计 txt 文件名数量
setlocal EnableExtensions set TEXT_COUNT=0 for %%a in (*.txt) do set /a TEXT_COUNT+=1
7 连接远程共享文件系统
Windows 可以使用 net use
命令来连接远程共享的网络文件系统
D:\Test>net use /? 此命令的语法是: NET USE [devicename | *] [\\computername\sharename[\volume] [password | *]] [/USER:[domainname\]username] [/USER:[dotted domain name\]username] [/USER:[username@dotted domain name] [/SMARTCARD] [/SAVECRED] [/REQUIREINTEGRITY] [/REQUIREPRIVACY] [/WRITETHROUGH] [[/DELETE] | [/PERSISTENT:{YES | NO}]] NET USE {devicename | *} [password | *] /HOME NET USE [/PERSISTENT:{YES | NO}] D:\Test>net use 会记录新的网络连接。 状态 本地 远程 网络 ------------------------------------------------------------------------------- OK Z: \\192.168.1.100\Share Microsoft Windows Network 命令成功完成。 D:\Test>net use z: /delete 在与 z: 的连接中,有打开的文件和/或没有结束的目录搜索。 是否继续断开连接并强行关闭? (Y/N) [N]: y z: 已经删除。 D:\Test>net use z: \\192.168.1.100\Share 命令成功完成。 D:\Test>