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

那個少年發表於2018-07-21

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系統的語言集與位置等。

相關文章