it-swarm.com.ru

Как разбить строку по пробелам в командном файле Windows?

Предположим, у меня есть строка "AAA BBB CCC DDD EEE FFF".

Как я могу разбить строку и получить n-ю подстроку в командном файле?

Эквивалент в C # будет

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

смотрите HELP FOR и смотрите примеры

или быстро попробуйте это

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

Три возможных решения для перебора слов строки:

Версия 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 обрабатывают символы как '=', ';' или ',' как разделители слов. Эти символы имеют тот же эффект, что и символ пробела.

33
Christian d'Heureuse

Это единственный код, который работал для меня:

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

Результат:

ddd
26
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

или Powershell для индексированного массива 0.

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 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
set a=AAA BBB CCC DDD EEE FFF
set a=%a:~6,1%

Этот код находит 5-й символ в строке . Если бы я хотел найти 9-ю строку, я бы заменил 6 на 10 (добавьте один).

1
Jon

Это работает для меня (просто выдержка из всего моего сценария)

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

ОБНОВЛЕНИЕ: Первоначально я опубликовал решение более сложной проблемы, чтобы получить полный разбив любой строки с любым разделителем (просто изменив delims). Я прочитал больше принятых решений, чем то, что хотел ОП, извините. Я думаю, что в этот раз я соблюдаю исходные требования:

 @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

вы можете использовать vbscript вместо пакета (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

использование:

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"

Покажет 2 слова main string. Конечно, вы должны взаимно использовать echo %%a %%b

Таким образом, результат будет:

hello how
0
Mohammadreza Panahi

Если кому-то нужно разделить строку с любым разделителем и сохранить значения в отдельных переменных, вот скрипт, который я построил,

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

Объяснение: 'tokens' определяет, какие элементы вам нужно передать в тело FOR, с токеном, ограниченным символом 'x'. Поэтому после разграничения первый и второй токены передаются в тело. В теле% i относится к первому токену, а% j относится ко второму токену. Мы можем взять% k для ссылки на 3-й токен и так далее.

Пожалуйста, также введите HELP FOR в cmd, чтобы получить подробное объяснение.

0
p_champ