2009-11-10 9 views

Odpowiedz

27

zobaczyć HELP FOR i zobacz przykłady

lub szybkie spróbować

for /F %%a in ("AAA BBB CCC DDD EEE FFF") do echo %%c 
+0

Dzięki, to na pewno działa Miałem nadzieję, aby móc go parametryzacji, więc mogę dostać ntą ciąg, nie ... 3rd ciąg (%% c). lub 4. ciąg (%% d). – Cheeso

+0

Zauważ, że to również pęka na "=" (i prawdopodobnie również na innych) – SvenS

+2

albo robię coś złego, albo to już nie działa. po prostu wypisuje "% c" – Xerus

0

można użyć VBScript zamiast partii (cmd.exe)

Set objFS = CreateObject("Scripting.FileSystemObject") 
Set objArgs = WScript.Arguments 
str1 = objArgs(0) 
s=Split(str1," ") 
For i=LBound(s) To UBound(s) 
    WScript.Echo s(i) 
    WScript.Echo s(9) ' get the 10th element 
Next 

Wykorzystanie:

c:\test> cscript /nologo test.vbs "AAA BBB CCC" 
7

łatwy plik

partii:

FOR %%A IN (1 2 3) DO ECHO %%A 

Linia komend:

FOR %A IN (1 2 3) DO ECHO %A 

wyjściowa:

1 
2 
3 
14

Poniższy kod będzie podzielić ciąg z dowolnej liczby podciągi:

@echo off 
setlocal ENABLEDELAYEDEXPANSION 

REM Set a string with an arbitrary number of substrings separated by semi colons 
set teststring=The;rain;in;spain 

REM Do something with each substring 
:stringLOOP 
    REM Stop when the string is empty 
    if "!teststring!" EQU "" goto END 

    for /f "delims=;" %%a in ("!teststring!") do set substring=%%a 

     REM Do something with the substring - 
     REM we just echo it for the purposes of demo 
     echo !substring! 

REM Now strip off the leading substring 
:striploop 
    set stripchar=!teststring:~0,1! 
    set teststring=!teststring:~1! 

    if "!teststring!" EQU "" goto stringloop 

    if "!stripchar!" NEQ ";" goto striploop 

    goto stringloop 
) 

:END 
endlocal 
1
set a=AAA BBB CCC DDD EEE FFF 
set a=%a:~6,1% 

Kod ten znajdzie 5th znak w łańcuchu. Gdybym chciał znaleźć dziewiąty ciąg, zamieniłbym 6 na 10 (dodaj jeden).

+0

Twoje małe rozwiązanie działa bardzo dobrze, dzięki – otaviodecampos

22

To jest tylko kod, który pracował dla mnie:

for /f "tokens=4" %%G IN ("aaa bbb ccc ddd eee fff") DO echo %%G 

wyjściowa:

ddd 
+0

To zdecydowanie powinna być akceptowana odpowiedź. Bez '/ f" toke ns..', to nie działa na Windows 10. – Annie

2

lub PowerShell dla 0 tablicy indeksowanej.

PS C:\> "AAA BBB CCC DDD EEE FFF".Split() 
AAA 
BBB 
CCC 
DDD 
EEE 
FFF 

PS C:\> ("AAA BBB CCC DDD EEE FFF".Split())[0] 
AAA 
3

Poniższy kod podzieli ciąg z liczbą N podciągów z # wartościami oddzielonymi.Można użyć dowolnego ogranicznika

@echo off 
if "%1" == "" goto error1 

set _myvar="%1" 

:FORLOOP 
For /F "tokens=1* delims=#" %%A IN (%_myvar%) DO (
    echo %%A 
    set _myvar="%%B" 
    if NOT "%_myvar%"=="" goto FORLOOP 
) 

goto endofprogram 
:error1 
echo You must provide Argument with # separated 

goto endofprogram 
:endofprogram 
28

trzech możliwych rozwiązań iterację słów wyrażenie:

Wersja 1:

@echo off & setlocal 
set s=AAA BBB CCC DDD EEE FFF 
for %%a in (%s%) do echo %%a 

Wersja 2:

@echo off & setlocal 
set s=AAA BBB CCC DDD EEE FFF 
set t=%s% 
:loop 
for /f "tokens=1*" %%a in ("%t%") do (
    echo %%a 
    set t=%%b 
    ) 
if defined t goto :loop 

Wersja 3 :

@echo off & setlocal 
set s=AAA BBB CCC DDD EEE FFF 
call :sub1 %s% 
exit /b 
:sub1 
if "%1"=="" exit /b 
echo %1 
shift 
goto :sub1 

Wersja 1 nie działa, gdy ciąg zawiera znaki wieloznaczne, takie jak "*" lub "?".

Wersje 1 i 3 traktują znaki takie jak "=", ";" lub "," jako separatory słów. Te postacie mają ten sam efekt co postać spacji.

+0

Wersja 1 działa również dla list rozdzielonych przecinkami, np. ABC, DEF, GHI, JKL – FrinkTheBrave

+0

Świetnie! Użyto 'set/p s = sjoy

+1

Wersja 2 jest najlepsza dla (większości) arbitralnych znaków ogranicznika. – mojo

2
@echo off 

:: read a file line by line 
for /F %%i in ('type data.csv') do (
    echo %%i 
    :: and we extract four tokens, ; is the delimiter. 
    for /f "tokens=1,2,3,4 delims=;" %%a in ("%%i") do (
     set first=%%a&set second=%%b&set third=%%c&set fourth=%%d 
     echo %first% and %second% and %third% and %fourth% 
    ) 
) 
1

Oto rozwiązanie oparte na „function”, który przetwarza każdy znak aż znajdzie znak separatora.

Jest względnie powolny, ale przynajmniej nie jest zwiastunem (z wyjątkiem części funkcyjnej).

:: Example #1: 
set data=aa bb cc 
echo Splitting off from "%data%": 
call :split_once "%data%" " " "left" "right" 
echo Split off: %left% 
echo Remaining: %right% 
echo. 

:: Example #2: 
echo List of paths in PATH env var: 
set paths=%PATH% 
:loop 
    call :split_once "%paths%" ";" "left" "paths" 
    if "%left%" equ "" goto loop_end 
    echo %left% 
goto loop 
:loop_end 



:: HERE BE FUNCTIONS 
goto :eof 

:: USAGE: 
:: call :split_once "string to split once" "delimiter_char" "left_var" "right_var" 
:split_once 
    setlocal 
    set right=%~1 
    set delimiter_char=%~2 
    set left= 

    if "%right%" equ "" goto split_once_done 

    :split_once_loop 
     if "%right:~0,1%" equ "%delimiter_char%" set right=%right:~1%&& goto split_once_done 
     if "%right:~0,1%" neq "%delimiter_char%" set left=%left%%right:~0,1% 
     if "%right:~0,1%" neq "%delimiter_char%" set right=%right:~1% 
     if "%right%" equ "" goto split_once_done 
    goto split_once_loop 

    :split_once_done 
    endlocal & set %~3=%left%& set %~4=%right% 
goto:eof 
0

UPDATE: Cóż, początkowo napisałem rozwiązanie do bardziej trudny problem, aby uzyskać pełny podział dowolny ciąg z dowolnego ogranicznika (tylko zmiana delims). Czytałem więcej akceptowanych rozwiązań niż to, co chciał OP, przepraszam. Myślę, że tym razem zgodny z pierwotnymi wymogami:

@echo off 
IF [%1] EQU [] echo get n ["user_string"] & goto :eof 
set token=%1 
set /a "token+=1" 
set string= 
IF [%2] NEQ [] set string=%2 
IF [%2] EQU [] set string="AAA BBB CCC DDD EEE FFF" 
FOR /F "tokens=%TOKEN%" %%G IN (%string%) DO echo %%~G 

Inną wersję z lepszym interfejsem użytkownika:

@echo off 
IF [%1] EQU [] echo USAGE: get ["user_string"] n & goto :eof 
IF [%2] NEQ [] set string=%1 & set token=%2 & goto update_token 
set string="AAA BBB CCC DDD EEE FFF" 
set token=%1 
:update_token 
set /a "token+=1" 
FOR /F "tokens=%TOKEN%" %%G IN (%string%) DO echo %%~G 

przykłady wyjściowe:

E:\utils\bat>get 
USAGE: get ["user_string"] n 
E:\utils\bat>get 5 
FFF 
E:\utils\bat>get 6 
E:\utils\bat>get "Hello World" 1 
World 

Jest to plik wsadowy do podziel katalogi ścieżki:

@echo off 
set string="%PATH%" 
:loop 
FOR /F "tokens=1* delims=;" %%G IN (%string%) DO (
    for /f "tokens=*" %%g in ("%%G") do echo %%g 
    set string="%%H" 
    ) 
if %string% NEQ "" goto :loop 

2-cia wersja:

@echo off 
set string="%PATH%" 
:loop 
FOR /F "tokens=1* delims=;" %%G IN (%string%) DO set line="%%G" & echo %line:"=% & set string="%%H" 
if %string% NEQ "" goto :loop 

3-ta wersja:

@echo off 
set string="%PATH%" 
:loop 
FOR /F "tokens=1* delims=;" %%G IN (%string%) DO CALL :sub "%%G" "%%H" 
if %string% NEQ "" goto :loop 
goto :eof 

:sub 
set line=%1 
echo %line:"=% 
set string=%2 
+0

Ale to nie pasuje do pytania – jeb

+0

Masz rację, przegapiłem [n] szczegół! –

0

Działa to dla mnie (tylko wyciąg z całego mojego skryptu)

choice /C 1234567H /M "Select an option or ctrl+C to cancel" 
set _dpi=%ERRORLEVEL% 

if "%_dpi%" == "8" call :helpme && goto menu 

for /F "tokens=%_dpi%,*" %%1 in ("032 060 064 096 0C8 0FA 12C") do set _dpi=%%1 
echo _dpi:%_dpi%: 
2

skończyło się z następujących czynności:

set input=AAA BBB CCC DDD EEE FFF 
set nth=4 
for /F "tokens=%nth% delims= " %%a in ("%input%") do set nthstring=%%a 
echo %nthstring% 

Dzięki temu można sparametryzować wejście i indeks. Upewnij się, że umieściłeś ten kod w pliku bat.

+0

To było właśnie to, czego potrzebowałem do wyodrębnienia większych i mniejszych wersji z ciągu wersji w kompilacji postu. Dzięki! – tobriand

-1

jeszcze jedna odmiana - to wygląda na program "cmd.exe”w bieżącej ścieżce i raporty pierwszy mecz.

@echo off 
setlocal 
setlocal enableextensions 
setlocal enabledelayedexpansion 

set P=%PATH% 
:pathloop 
for /F "delims=; tokens=1*" %%f in ("!P!") do (
    set F=%%f 
    if exist %%f\cmd.exe goto found 
    set P=%%g 
) 
if defined P goto pathloop 

echo path of cmd.exe was not found! 
goto end 

:found 
echo found cmd.exe at %F% 
goto end 

:end 
+0

Twoja odpowiedź nie ma nic wspólnego z pytaniem – jeb

+0

zmienną ścieżki jest wspólny ciąg. rozdzielenie go odbywa się w przykładzie. i dodano małą operację, która pokaże wszystkim, jak można wykonać prawdziwą pracę z pętlą analizy. ten przykład pracy pokazuje reakcję "wyjścia z pierwszego trafienia". – alex

Powiązane problemy