Załóżmy, że mam ciąg "AAA BBB CCC DDD EEE FFF".Jak podzielić łańcuch na spacje w pliku wsadowym Windows?
Jak mogę podzielić ciąg i pobrać n-ty podciąg w pliku wsadowym?
Równowartość w C# byłoby
"AAA BBB CCC DDD EEE FFF".Split()[n]
Załóżmy, że mam ciąg "AAA BBB CCC DDD EEE FFF".Jak podzielić łańcuch na spacje w pliku wsadowym Windows?
Jak mogę podzielić ciąg i pobrać n-ty podciąg w pliku wsadowym?
Równowartość w C# byłoby
"AAA BBB CCC DDD EEE FFF".Split()[n]
zobaczyć HELP FOR
i zobacz przykłady
lub szybkie spróbować
for /F %%a in ("AAA BBB CCC DDD EEE FFF") do echo %%c
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"
ł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
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
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).
Twoje małe rozwiązanie działa bardzo dobrze, dzięki – otaviodecampos
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
To zdecydowanie powinna być akceptowana odpowiedź. Bez '/ f" toke ns..', to nie działa na Windows 10. – Annie
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
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
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.
Wersja 1 działa również dla list rozdzielonych przecinkami, np. ABC, DEF, GHI, JKL – FrinkTheBrave
Świetnie! Użyto 'set/p s =
Wersja 2 jest najlepsza dla (większości) arbitralnych znaków ogranicznika. – mojo
@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%
)
)
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
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
Ale to nie pasuje do pytania – jeb
Masz rację, przegapiłem [n] szczegół! –
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%:
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.
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
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
Twoja odpowiedź nie ma nic wspólnego z pytaniem – jeb
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
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
Zauważ, że to również pęka na "=" (i prawdopodobnie również na innych) – SvenS
albo robię coś złego, albo to już nie działa. po prostu wypisuje "% c" – Xerus