UP | HOME

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 脚本中没有函数,可以使用符号模拟的方式来创建

  1. 定义的函数一定要写在脚本最后
  2. 需要通过 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 遍历传入的命令行参数

这里使用到

  1. shift 来移动传入的参数
  2. 通过跳转来模拟循环
@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>

Last Updated 2021-01-03 Sun 14:59. Created by Jinghui Hu at 2020-12-30 Wed 19:16.