web-dev-qa-db-ja.com

Windowsバッチファイルで文字列をスペースで分割する方法は?

「AAA BBB CCC DDD EEE FFF」という文字列があるとします。

バッチファイルで文字列を分割してn番目の部分文字列を取得するにはどうすればよいですか?

C#で同等の

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

HELP FORおよび例を参照してください

または簡単に試してみてください

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

文字列の単語を反復処理する3つの可能な解決策:

バージョン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は、文字を「=」、「;」のように扱いますまたはワード区切り文字としての「、」。これらの文字は、スペース文字と同じ効果があります。

39

これは私のために働いた唯一のコードです:

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

出力:

ddd
27
Scott E

次のコードは、任意の数のサブストリングでストリングを分割します。

@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
14
Dave

かんたん

バッチファイル:

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

コマンドライン:

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

出力:

1
2
3
7
capdragon

次のコードは、#個の値で区切られた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
3
user2637808

または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
2
ecciethetechie
@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% 
    )
)
2
Pello X
set a=AAA BBB CCC DDD EEE FFF
set a=%a:~6,1%

このコードは、文字列の5番目の文字を見つけます。 9番目の文字列を検索する場合、6を10に置き換えます(1を追加)。

2
Jon

私は次のようになりました:

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ファイルに入れてください。

2
Bruno

以下は、区切り文字が見つかるまで各文字を処理する「 function 」に基づくソリューションです。

比較的遅いですが、少なくとも頭の体操ではありません(機能部分を除く)。

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

区切り文字で文字列を分割し、別の変数に値を保存する必要がある場合、私が作成したスクリプトは次のとおりです。

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

説明:「トークン」は、文字「x」で区切られたトークンを使用して、FORの本体に渡す必要のある要素を定義します。したがって、区切り後、最初と2番目のトークンが本文に渡されます。本文では、%iは最初のトークンを指し、%jは2番目のトークンを指します。 %kを使用して、3番目のトークンなどを参照できます。

詳細な説明を表示するには、cmdにHELP FORと入力してください。

1
p_champ

これは私のために機能します(スクリプト全体からの抜粋)

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

PDATE:さて、最初に、より難しい問題の解決策を投稿しました。デリミタを使用して文字列を完全に分割しました(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

これは、パスのディレクトリを分割するバッチファイルです。

@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番目のバージョン:

@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バージョン:

@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
carlos_lm

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"
0
ghostdog74

これを試して :

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

注意:

"tokens"は分割された単語を決定します。たとえば、次のように使用できます:

"tokens=1,2"

main string2ワードを表示します。もちろん、echo %%a %%bを相互に使用する必要があります

したがって、出力は次のようになります。

hello how
0
BattleTested