Cách tốt nhất để chia một biến thành một mảng (hoặc càng gần một mảng như Windows mẻ có thể bắt chước) là đặt giá trị của biến sang một định dạng có thể được hiểu bởi một for
vòng lặp. for
mà không có bất kỳ thiết bị chuyển mạch nào sẽ tách một dòng từng từ, tách ra ở các dấu phân tách kiểu csv (dấu phẩy, dấu cách, tab hoặc dấu chấm phẩy).
Điều này phù hợp hơn for /f
, vòng lặp theo từng dòng thay vì từng từ và cho phép tách một chuỗi số phần tử không xác định.
Về cơ bản, cách chia nhỏ với vòng lặp for
hoạt động.
setlocal enabledelayedexpansion
set idx=0
for %%I in ("%var:;=","%") do (
set "var[!idx!]=%%~I"
set /a "idx+=1"
)
Phần quan trọng là việc thay thế ;
vào ","
trong %var%
, và kèm theo toàn bộ điều trong dấu ngoặc kép. Thật vậy, đây là ví dụ most graceful method chia tách biến môi trường %PATH%
.
Đây là một cuộc biểu tình hoàn chỉnh hơn, gọi một chương trình con để chia một biến.
@echo off
setlocal enabledelayedexpansion
set string=one;two;three;four;five;
:: Uncomment this line to split %PATH%
:: set string=%PATH%
call :split "%string%" ";" array
:: Loop through the resulting array
for /L %%I in (0, 1, %array.ubound%) do (
echo array[%%I] = !array[%%I]!
)
:: end main script
goto :EOF
:: split subroutine
:split <string_to_split> <split_delimiter> <array_to_populate>
:: populates <array_to_populate>
:: creates arrayname.length (number of elements in array)
:: creates arrayname.ubound (upper index of array)
set "_data=%~1"
:: replace delimiter with " " and enclose in quotes
set _data="!_data:%~2=" "!"
:: remove empty "" (comment this out if you need to keep empty elements)
set "_data=%_data:""=%"
:: initialize array.length=0, array.ubound=-1
set /a "%~3.length=0, %~3.ubound=-1"
for %%I in (%_data%) do (
set "%~3[!%~3.length!]=%%~I"
set /a "%~3.length+=1, %~3.ubound+=1"
)
goto :EOF
Dưới đây là đầu ra của kịch bản trên:
C:\Users\me\Desktop>test.bat
array[0] = one
array[1] = two
array[2] = three
array[3] = four
array[4] = five
Just for fun, hãy thử bỏ bình luận dòng set string=%PATH%
và để cho các lần cuộn tốt.
cảm ơn trả lời, tôi có những gì tôi cần bây giờ, nhưng để tham khảo trong tương lai, nếu tôi muốn mở rộng cho một chặng đường dài với rất nhiều phần, làm thế nào tôi có thể làm điều này mà không cần phải individauly thiết lập mỗi một %% i sau đó% % j. – user2035296
Tôi đã chỉnh sửa. Với mã thứ hai, bạn chỉ cần '%% i'. – Endoro