windows bat系列9:for处理案例三 单行按指定分隔符分割

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系统的语言集与位置等。

猜你喜欢

转载自blog.csdn.net/zhaogang1993/article/details/81143169
今日推荐