「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
文字列の単語を反復処理する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は、文字を「=」、「;」のように扱いますまたはワード区切り文字としての「、」。これらの文字は、スペース文字と同じ効果があります。
これは私のために働いた唯一のコードです:
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
または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
@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%
)
)
set a=AAA BBB CCC DDD EEE FFF
set a=%a:~6,1%
このコードは、文字列の5番目の文字を見つけます。 9番目の文字列を検索する場合、6を10に置き換えます(1を追加)。
私は次のようになりました:
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ファイルに入れてください。
以下は、区切り文字が見つかるまで各文字を処理する「 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
区切り文字で文字列を分割し、別の変数に値を保存する必要がある場合、私が作成したスクリプトは次のとおりです。
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と入力してください。
これは私のために機能します(スクリプト全体からの抜粋)
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%:
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
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"
これを試して :
for /F "tokens=1,2" %%a in ("hello how are you") do echo %%a %%b
注意:
"tokens"
は分割された単語を決定します。たとえば、次のように使用できます:
"tokens=1,2"
main stringの2
ワードを表示します。もちろん、echo %%a %%b
を相互に使用する必要があります
したがって、出力は次のようになります。
hello how