如何在Windows批处理文件中按空格分割字符串?

Che*_*eso 56 windows split batch-file

假设我有一个字符串"AAA BBB CCC DDD EEE FFF".

如何在批处理文件中拆分字符串并检索第n个子字符串?

C#中的等价物将是

"AAA BBB CCC DDD EEE FFF".Split()[n]
Run Code Online (Sandbox Code Playgroud)

Chr*_*use 40

迭代字符串的三种可能的解决方案:

版本1:

@echo off & setlocal
set s=AAA BBB CCC DDD EEE FFF
for %%a in (%s%) do echo %%a
Run Code Online (Sandbox Code Playgroud)

版本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
Run Code Online (Sandbox Code Playgroud)

版本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
Run Code Online (Sandbox Code Playgroud)

当字符串包含'*'或'?'等通配符时,版本1不起作用.

版本1和3处理'=',';'等字符 或','作为单词分隔符.这些字符与空格字符具有相同的效果.

  • @snahl在版本2中,`%% b`包含剩余的单词.`set t = %% b`从变量`t`中删除第一个单词."for"循环每次只执行一次,因为指定了`/ f`参数,而`("%t%")`只是一行文本."goto:loop"是每个单词执行一次的实际循环. (3认同)
  • 在版本 2 中: `set t=%%b` 到底在做什么?它从何而来?抱歉我不明白。请解释一下吗?谢谢。 (2认同)

PA.*_*PA. 31

看看HELP FOR并看到例子

或者快点试试吧

 for /F %%a in ("AAA BBB CCC DDD EEE FFF") do echo %%c
Run Code Online (Sandbox Code Playgroud)

  • 看起来在 Windows 10 上不起作用。也许应该将其添加到回复中。 (6认同)
  • 对我来说,直到我在/ F之后添加"tokens = 1,2",或者只设置了第一个变量(%% a),它才起作用. (3认同)
  • 要么我做错了,要么就是不行了.对我来说它只输出"%c" (2认同)
  • 那不是命令行命令,而是蝙蝠命令 (2认同)

小智 28

这是唯一适合我的代码:

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

输出:

ddd
Run Code Online (Sandbox Code Playgroud)

  • 这绝对应该是公认的答案。如果没有 `/f "tokens..`,它无法在 Windows 10 上运行。 (2认同)

Dav*_*ave 14

以下代码将使用任意数量的子字符串拆分字符串:

@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
Run Code Online (Sandbox Code Playgroud)


Bru*_*uno 8

我最终得到以下结果:

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%
Run Code Online (Sandbox Code Playgroud)

这样您就可以参数化输入和索引。确保将此代码放入 bat 文件中。


cap*_*gon 7

简单

批处理文件:

FOR %%A IN (1 2 3) DO ECHO %%A
Run Code Online (Sandbox Code Playgroud)

命令行:

FOR %A IN (1 2 3) DO ECHO %A
Run Code Online (Sandbox Code Playgroud)

输出:

1
2
3
Run Code Online (Sandbox Code Playgroud)


p_c*_*amp 6

如果有人需要用任何分隔符拆分字符串并将值存储在单独的变量中,这是我构建的脚本,

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

说明:'tokens' 定义了需要传递给 FOR 主体的元素,标记由字符 'x' 分隔。所以在定界之后,第一个和第二个标记被传递给正文。在正文中, %i 指的是第一个标记, %j 指的是第二个标记。我们可以用 %k 来指代第三个令牌等等..

还请在 cmd 中键入HELP FOR以获取详细说明。