バッチを使用して、変数を2つまたは3つの部分に分割できるようにしたいのですが、それらを分割する記号があります。たとえば、次のような文字列がある場合:var1; var2;
var1を変数に、var2を別の変数にするにはどうすればよいですか。
前もって感謝します
バッチを使用して、変数を2つまたは3つの部分に分割できるようにしたいのですが、それらを分割する記号があります。たとえば、次のような文字列がある場合:var1; var2;
var1を変数に、var2を別の変数にするにはどうすればよいですか。
前もって感謝します
変数を配列に分割する(またはWindowsバッチが模倣できる限り配列に近い)最良の方法は、変数の値をfor
ループで理解できる形式にすることです。 for
スイッチがないと、行が単語ごとに分割され、csvタイプの区切り文字(カンマ、スペース、タブ、またはセミコロン)で分割されます。
for /f
これは、単語ごとではなく行ごとにループする、よりも適切であり、未知の数の要素の文字列を分割できます。
基本的に、for
ループを使用した分割の仕組みは次のとおりです。
setlocal enabledelayedexpansion
set idx=0
for %%I in ("%var:;=","%") do (
set "var[!idx!]=%%~I"
set /a "idx+=1"
)
重要な部分は、;
intoを","
in%var%
に置き換え、全体を引用符で囲むことです。実際、これは、たとえば環境変数を分割するための最も適切な方法です。%PATH%
これは、変数を分割するためのサブルーチンを呼び出す、より完全なデモンストレーションです。
@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
上記のスクリプトの出力は次のとおりです。
C:\Users\me\Desktop>test.bat
array[0] = one
array[1] = two
array[2] = three
array[3] = four
array[4] = five
楽しみのために、set string=%PATH%
ラインのコメントを外して、楽しい時間を過ごしましょう。
Tokens=1,2
2つのforループ変数%%i
を作成し、 %%j
&string
を区切り文字で区切って2つの部分に分割し;
ます。
@echo off &setlocal
set "string=var1;var2;"
for /f "tokens=1,2 delims=;" %%i in ("%string%") do set "variable1=%%i" &set "variable2=%%j"
echo variable1: %variable1%
echo variable2: %variable2%
endlocal
pause
より「動的な」方法については、次を使用してください。
@echo off &setlocal enabledelayedexpansion
set "string=var1;var2;"
set /a count=0
for %%i in (%string%) do (
set /a count+=1
set "variable!count!=%%i"
)
echo found %count% variables
for /l %%i in (1,1,%count%) do (
echo variable%%i: !variable%%i!
)
endlocal
「1つ」しか表示されない場合は、行を変更してください
for /L %%I in (0, 1, %array.ubound%) do (
に
for /L %%I in (0, 1, !array.ubound!) do (