如何在批处理循环中分隔空格和多个空格分隔符?

时间:2014-05-05 11:42:16

标签: batch-file for-loop

由于“net user”命令

,解析文本时遇到问题
ABC                      ABCDE                    ABCDEFG                  
ABDCS HFJ                ATi                      CObdnsen 

批处理脚本中单独的行中的单个用户。

我的代码是:

FOR /F "tokens=1,2,3 delims= " %%A in (test.txt) do echo %%A & echo %%B & echo %%C

问题是我的文本的第二行,其中包含中间位置的用户名。

请注意,我想要这个结果:

ABC
ABCDE
ABCDEFG
ABDCS HFJ
ATi
CObdnsen

那么解决方案是什么?

3 个答案:

答案 0 :(得分:2)

它看起来是固定宽度列,每列25个字符。您可以将每一行加载到变量中,并使用子字符串操作来获取值。

@echo off
setlocal enableDelayedExpansion
for /f delims^=^ eol^= %%A in (test.txt) do (
  set "ln=%%A"
  echo col1=[!ln:~0,25!]
  echo col2=[!ln:~25,25!]
  echo col3=[!ln:~50!]
  echo(
)

但是这会让你遇到从每个值的末尾删除尾随空格的问题。这是可行的,但批量不容易。上面脚本的输出将方括号内的值括起来,这样您就可以轻松查看尾随空格问题。

我没有弄乱删除尾随空格的问题,而是使用我的REPL.BAT utility将数据从固定宽度转换为分隔格式。 REPL.BAT是一个混合JScript /批处理实用程序,它在stdin上执行正则表达式搜索/替换操作,并将结果写入stdout。它是纯脚本,可​​以在任何现代Windows机器上运行,从XP开始,无需任何第三方可执行文件。完整的文档嵌入在脚本中。

我会使用REPL.BAT在第25和第50个字符后插入分隔符。然后,我将使用另一个REPL.BAT去除分隔符之前的任何空格,然后正常的FOR / F可以安全地解析这些值。我选择使用管道(|)作为分隔符。

@echo off
for /f "eol=| delims=| tokens=1-3" %%A in (
  'type test.txt ^| repl "^(.{25})(.{25})" "$1|$2|" ^| repl " *\|" "|"'
) do (
  echo col1=[%%A]
  echo col2=[%%B]
  echo col3=[%%C]
  echo(
)

如果您知道没有值包含连续的空格,并且所有值之间至少有2个空格,那么您可以使用单个REPL替换2个或更多空格并使用分隔符

@echo off
for /f "eol=| delims=| tokens=1-3" %%A in (
  'type test.txt ^| repl " {2,}" "|"'
) do (
  echo col1=[%%A]
  echo col2=[%%B]
  echo col3=[%%C]
  echo(
)

答案 1 :(得分:0)

@echo off
    setlocal enableextensions

    for /f "tokens=*" %%a in ('net user^|find "  "') do (
        set "u=%%a"
        setlocal enabledelayedexpansion
        set "u=!u:  =/!"
        set "u=!u:/ =/!"
        for /f "tokens=1 delims=/" %%b in ("!u!") do echo %%b
        endlocal   
    )

    endlocal

不是防弹。如果用户名中包含两个空格,或者(可能未经过测试)名称为24个字符或更多(仅限于两个),则会失败。

答案 2 :(得分:0)

感谢MC ND的好主意......但是你的答案应该如下编辑,以获得最佳效果:

@echo off
    setlocal enableextensions

    for /f "tokens=*" %%a in ('net user^|find "     "') do (
        set "u=%%a"
        setlocal enabledelayedexpansion
        set "u=!u:  =/!"
        set "u=!u:/ =/!"
        for /f "tokens=1,2,3 delims=/" %%b in ("!u!") do echo %%b & echo %%c & echo %%d
        endlocal   
    )

    endlocal

请注意,分隔符为" 5个空格"。因为在Windows中允许的最大用户长度是20个字符。列之间的距离是25个字符..所以我们至少有5个空格作为一个好的分隔符。我们不担心用户名中间的空格。 最后你应该解析三个令牌。不仅是一个令牌。 感谢您的关注。