1. 需求
假设有一行字符串,由几个字串组成,每个字串间用分隔符delimiter连接,我们要对各个子串进行操作。这就涉及到将单行字符串按分隔符分割。如PATH环境变量就是这样,每个字串就是一个路径:
C:\Users\Administrator.WIN7-1609051925>echo %path%
C:\Program Files (x86)\Common Files\Oracle\Java\javapath;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files (x86)\Windows Kits\8.1\Windows Performance Toolkit\;C:\Program Files\Microsoft SQL Server\110\Tools\Binn\;D:\software\apache-tomcat-9.0.8\bin;D:\software\apache-tomcat-9.0.8\lib;C:\Program Files\7-Zip
2. 代码
@echo off
Rem close echo
Rem chane active page
chcp 437 >nul
Rem delay expansion
setlocal enabledelayedexpansion
Rem set parameters
set TESTLIST=D:\myself\windows_script\bat_out;D:\myself\windows_script\bat_test;D:\myself\windows_script\testnull;
set TMPLIST=%TESTLIST%
Rem print title
echo=
echo=
echo=
echo ---------------------------%date% %time:~0,8%---------------------------
set /a NUM = 1
:loop
for /f "tokens=1* delims=;" %%a in ("%TMPLIST%") do (
Rem set local parameters
echo #!NUM! is %%a
set /a NUM = NUM + 1
Rem recursion
set TMPLIST=%%b
)
if defined TMPLIST goto :loop
Rem
echo=
echo=
echo=
endlocal
pause
3. 代码解析
a. 待分割的变量TESTLIST最后一个字段末尾也需要加上“;”分隔符,否则将少分割一个字串;
b. 分割采用迭代算法,由于for /f "tokens=1* delims=;" %%a in ("%TMPLIST%") do (…)默认是指定分隔符按行分割字符串,而我们总共只有一行字符串,因而我们把分割后的字符串重新存入临时变量:
set TMPLIST=%%b
后续通过DOS的goto再次迭代分割,最终达到目的;
c. 自定义NUM变量表示分割出来的字串的序号(从1开始);
d. %date% %time:~0,8%是截取系统日期显示出来。
4. 测试结果
结果表面:分割正确。
有个小bug:显示日期是出现??乱码,那个位置应该是显示星期几。此问题笔者不想再改了,请读者自行研究。提示:需要修改windows系统的语言集与位置等。