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

<p>предположим, у меня есть строка "aaa bbb ccc ddd eee fff".</p><p>как я могу разбить строку и получить n-ю подстроку в командном файле?</p><p>эквивалент в c # будет</p><pre><code>"aaa bbb ccc ddd eee fff".split()[n] </code></pre>

<p>смотрите <code>help for</code> и смотрите примеры</p><p>или быстро попробуйте это</p><pre><code> for /f %%a in ("aaa bbb ccc ddd eee fff") do echo %%c </code></pre>

<p>три возможных решения для перебора слов строки:</p><p>версия 1:</p><pre><code>@echo off & setlocal set s=aaa bbb ccc ddd eee fff for %%a in (%s%) do echo %%a </code></pre><p>версия 2:</p><pre><code>@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 </code></pre><p>версия 3:</p><pre><code>@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 </code></pre><p>версия 1 не работает, если строка содержит символы подстановки, такие как «*» или «?».</p><p>версии 1 и 3 обрабатывают символы как '=', ';' или ',' как разделители слов. эти символы имеют тот же эффект, что и символ пробела.</p>

<p>это единственный код, который работал для меня:</p><pre><code>for /f "tokens=4" %%g in ("aaa bbb ccc ddd eee fff") do echo %%g </code></pre><p>результат:</p><pre><code>ddd </code></pre>

<p>следующий код разделит строку с произвольным количеством подстрок:</p><pre><code>@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 </code></pre>

<p>легко</p><p>командный файл:</p><pre><code>for %%a in (1 2 3) do echo %%a </code></pre><p>командная строка:</p><pre><code>for %a in (1 2 3) do echo %a </code></pre><p>результат:</p><pre><code>1 2 3 </code></pre>

<p>следующий код разделит строку с n количеством подстрок с # разделенными значениями. вы можете использовать любой разделитель</p><pre><code>@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 </code></pre>

<p>или powershell для индексированного массива 0.</p><pre><code>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 </code></pre>

<pre><code>@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% ) ) </code></pre>

<p>я закончил со следующим:</p><pre><code>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% </code></pre><p>при этом вы можете параметризовать вход и индекс. обязательно поместите этот код в файл bat.</p>

<p>вот решение, основанное на " <a href="http://ss64.com/nt/syntax-functions.html">function</a> ", которая обрабатывает каждый символ, пока не найдет символ разделителя.</p><p>это относительно медленно, но это, по крайней мере, не дразнилка мозга (за исключением функциональной части).</p><pre><code>:: 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 </code></pre>

<pre><code>set a=aaa bbb ccc ddd eee fff set a=%a:~6,1% </code></pre><p>этот код находит 5-й символ в строке . если бы я хотел найти 9-ю строку, я бы заменил 6 на 10 (добавьте один).</p>

<p>это работает для меня (просто выдержка из всего моего сценария)</p><pre><code>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%: </code></pre>

<p><strong> обновление: </strong> первоначально я опубликовал решение более сложной проблемы, чтобы получить полный разбив любой строки с любым разделителем (просто изменив <em>delims</em>). я прочитал больше принятых решений, чем то, что хотел оп, извините. я думаю, что в этот раз я соблюдаю исходные требования:</p><pre><code> @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 </code></pre><p>другая версия с лучшим пользовательским интерфейсом:</p><pre><code> @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 </code></pre><p>примеры вывода:</p><pre><code>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 </code></pre><p>это командный файл для разделения каталогов пути:</p><pre><code>@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 </code></pre><p>2-я версия:</p><pre><code>@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 </code></pre><p>3-я версия:</p><pre><code>@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 </code></pre>

<p>вы можете использовать vbscript вместо пакета (cmd.exe)</p><pre><code>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 </code></pre><p>использование:</p><pre><code>c:\test> cscript /nologo test.vbs "aaa bbb ccc" </code></pre>

<p>попробуй это :</p><pre><code>for /f "tokens=1,2" %%a in ("hello how are you") do echo %%a %%b </code></pre><p><strong> <em>примечание:</em> </strong></p><p><code>"tokens"</code> определяет разделенные слова, я имею в виду, например, вы можете использовать:</p><pre><code>"tokens=1,2" </code></pre><p>покажет <code>2</code> слова <em>main string</em>. конечно, вы должны взаимно использовать <code>echo %%a %%b</code></p><p>таким образом, результат будет:</p><pre><code>hello how </code></pre>

<p>если кому-то нужно разделить строку с любым разделителем и сохранить значения в отдельных переменных, вот скрипт, который я построил,</p><pre><code>for /f "tokens=1,2 delims=x" %i in ("1920x1080") do ( set w=%i set h=%j ) echo %w% echo %h% </code></pre><p>объяснение: 'tokens' определяет, какие элементы вам нужно передать в тело for, с токеном, ограниченным символом 'x'. поэтому после разграничения первый и второй токены передаются в тело. в теле% i относится к первому токену, а% j относится ко второму токену. мы можем взять% k для ссылки на 3-й токен и так далее.</p><p>пожалуйста, также введите<strong> help for </strong>в cmd, чтобы получить подробное объяснение.</p>