developer tip

Windows 배치 파일에서 문자열을 공백으로 분할하는 방법은 무엇입니까?

optionbox 2021. 1. 6. 08:04
반응형

Windows 배치 파일에서 문자열을 공백으로 분할하는 방법은 무엇입니까?


"AAA BBB CCC DDD EEE FFF"문자열이 있다고 가정합니다.

배치 파일에서 문자열을 분할하고 n 번째 하위 문자열을 검색하려면 어떻게해야합니까?

C #에서 동등한 것은

"AAA BBB CCC DDD EEE FFF".Split()[n]

참조 HELP FOR및 예제를 참조

또는 이것을 빨리 시도하십시오

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

문자열의 단어를 반복하는 세 가지 가능한 솔루션 :

버전 1 :

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

버전 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

버전 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

문자열에 '*'또는 '?'와 같은 와일드 카드 문자가 포함 된 경우 버전 1이 작동하지 않습니다.

버전 1과 3은 문자를 '=', ';'와 같이 취급합니다. 또는 ','를 단어 구분 기호로 사용합니다. 이러한 문자는 공백 문자와 동일한 효과를 갖습니다.


이것은 나를 위해 일한 유일한 코드입니다.

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

산출:

ddd

다음 코드는 임의의 수의 하위 문자열로 문자열을 분할합니다.

@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

쉬운

배치 파일:

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

명령 줄 :

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

산출:

1
2
3

다음 코드는 #으로 구분 된 값이있는 N 개의 하위 문자열이있는 문자열을 분할합니다. 구분 기호를 사용할 수 있습니다.

@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

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

이 코드는 문자열에서 다섯 번째 문자를 찾습니다. 9 번째 문자열을 찾으려면 6을 10으로 대체합니다 (하나 추가).


@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% 
    )
)

또는 0 인덱스 배열의 경우 Powershell.

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

나는 다음과 같이 끝났다.

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%

이를 통해 입력 및 색인을 매개 변수화 할 수 있습니다. 이 코드를 bat 파일에 넣어야합니다.


다음은 구분 문자를 찾을 때까지 각 문자를 처리 하는 " 함수 "를 기반으로하는 솔루션 입니다.

상대적으로 느리지 만 적어도 수수께끼는 아닙니다 (기능 부분 제외).

:: 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

누군가 구분 기호로 문자열을 분할하고 값을 별도의 변수에 저장해야하는 경우 여기에 제가 작성한 스크립트가 있습니다.

FOR /F "tokens=1,2 delims=x" %i in ("1920x1080") do (
  set w=%i
  set h=%j
)
echo %w%
echo %h%

설명 : 'tokens'는 문자 'x'로 구분 된 토큰으로 FOR 본문에 전달해야하는 요소를 정의합니다. 따라서 구분 후 첫 번째 및 두 번째 토큰이 본문으로 전달됩니다. 본문에서 % i는 첫 번째 토큰을 나타내고 % j는 두 번째 토큰을 나타냅니다. 세 번째 토큰 등을 참조하기 위해 % k를 사용할 수 있습니다.

또한 입력하세요 에 대한 도움말을 자세한 설명을 얻을 수 cmd를.


batch (cmd.exe) 대신 vbscript를 사용할 수 있습니다.

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

용법:

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

업데이트 : 글쎄, 처음에는 구분 기호가있는 모든 문자열을 완전히 분할하기 위해 더 어려운 문제에 대한 해결책을 게시했습니다 (단지 delims 변경 ). 나는 OP가 원했던 것보다 더 많은 수용된 해결책을 읽었습니다. 이번에는 원래 요구 사항을 준수한다고 생각합니다.

 @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

더 나은 사용자 인터페이스를 가진 다른 버전 :

 @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

출력 예 :

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

This is a batch file to split the directories of the path:

@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

2nd version:

@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

3rd version:

@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

This works for me (just an extract from my whole script)

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%:

Try this :

for /F "tokens=1,2" %%a in ("hello how are you") do echo %%a %%b

Notice :

"tokens" determines split words, I mean you can for example using of :

"tokens=1,2"

Will show 2 words of main string, Of course you should mutually use of echo %%a %%b

So the output will be :

hello how

one more variation - this looks for the program "cmd.exe" in the current path and reports the first match:

@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

ReferenceURL : https://stackoverflow.com/questions/1707058/how-to-split-a-string-by-spaces-in-a-windows-batch-file

반응형