2013-03-20 13 views
5

używając partii, chcę móc oddzielić zmienną na dwie lub trzy części, gdy jest symbol dzielący je. na przykład, jeśli mam ciąg znaków, który wygląda następująco: var1; var2;oddzielając zmienną z symbolem na różne części

W jaki sposób można uzyskać zmienną var1, aby zmienna i var2 stała się inna.

Dzięki z góry

Odpowiedz

6

Tokens=1,2 ma utworzyć dwa dla zmiennych pętli %%i i %%j & dzieli string na dwie części, rozdzielone przez separator ;:

@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 

Dla bardziej "dynamiczne" metody użyj:

@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 
+0

dzięki za odpowiedź, mam to, czego potrzebuję teraz, ale na przyszłość, jeśli chcę przedłużyć długą drogę z wieloma częściami, w jaki sposób mogę to zrobić bez konieczności ręcznego ustawiania każdego z nich na %%, a następnie% %jot. – user2035296

+0

Dokonałem edycji. Przy drugim kodzie potrzebujesz tylko '%% i'. – Endoro

10

Najlepszym sposobem, aby podzielić zmienną do tablicy (lub tak blisko do tablicy jako partia Windows może naśladować) jest umieścić wartość zmiennej w formacie, który może być rozumiany przez for pętla. for bez żadnych przełączników podzieli linię wyraz po słowie, dzieląc ograniczniki typu csv (przecinek, spacja, tabulator lub średnik).

Jest to właściwsze niż for /f, które wykonuje pętle wiersz po wierszu, a nie słowo po słowie, i pozwala dzielić ciąg nieznanej liczby elementów.

Oto, jak działa podział na pętlę for.

setlocal enabledelayedexpansion 
set idx=0 
for %%I in ("%var:;=","%") do (
    set "var[!idx!]=%%~I" 
    set /a "idx+=1" 
) 

Ważną częścią jest zastąpienie ; do "," w %var% i zamykając całość w cudzysłowie. Rzeczywiście, jest to most graceful method dzielenie na przykład zmiennej środowiskowej %PATH%.

Oto bardziej kompletna demonstracja, wywołanie podprogramu w celu podzielenia zmiennej.

@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 

Oto wynik powyższego skryptu:

C:\Users\me\Desktop>test.bat 
array[0] = one 
array[1] = two 
array[2] = three 
array[3] = four 
array[4] = five 

Tak dla zabawy, spróbuj un-komentując linię set string=%PATH% i pozwól dobrym czasom.

+0

wreszcie możliwe do zastosowania rozwiązanie! dzięki! –

Powiązane problemy