Как разбить строку по пробелам в командном файле Windows? - PullRequest
52 голосов
/ 10 ноября 2009

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

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

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

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

Ответы [ 17 ]

1 голос
/ 01 июля 2012
set a=AAA BBB CCC DDD EEE FFF
set a=%a:~6,1%

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

0 голосов
/ 25 апреля 2019

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

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

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

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

0 голосов
/ 15 октября 2018

Попробуйте это:

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

Примечание:

"tokens" определяет разделенные слова, я имею в виду, например, вы можете использовать:

"tokens=1,2"

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

Таким образом, вывод будет:

hello how
0 голосов
/ 03 декабря 2014

еще один вариант - он ищет программу «cmd.exe» в текущем пути и сообщает о первом совпадении:

@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
0 голосов
/ 30 октября 2014

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

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 голосов
/ 18 сентября 2014

UPDATE: Ну, изначально я опубликовал решение более сложной проблемы, чтобы получить полный разбив любой строки с любым разделителем (просто изменив 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 голосов
/ 10 ноября 2009

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