首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在批处理For循环中分隔空格和多个空格分隔符?

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

Stack Overflow用户
提问于 2014-05-05 11:42:15
回答 3查看 1.6K关注 0票数 0

由于"net user“命令,我在解析文本时遇到了问题。

代码语言:javascript
运行
复制
ABC                      ABCDE                    ABCDEFG                  
ABDCS HFJ                ATi                      CObdnsen 

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

我的代码是:

代码语言:javascript
运行
复制
FOR /F "tokens=1,2,3 delims= " %%A in (test.txt) do echo %%A & echo %%B & echo %%C

问题是我的文本的第二行包含一个中间有空格的用户名。

请注意,我希望得到这个结果:

代码语言:javascript
运行
复制
ABC
ABCDE
ABCDEFG
ABDCS HFJ
ATi
CObdnsen

那么解决方案是什么呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2014-05-06 05:15:34

谢谢你的好主意..。但你的答案应该编辑如下,以达到最好的效果:

代码语言:javascript
运行
复制
@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空格“。因为窗口中最允许的用户长度是20个字符。列之间的距离是25个字符。因此,我们至少有5个空格作为一个良好的分隔符。我们也不担心用户名中间的空格。最后,您应该解析三个令牌。不仅仅是一个记号。谢谢你们的关注伙计们。

票数 0
EN

Stack Overflow用户

发布于 2014-05-05 12:59:06

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

代码语言:javascript
运行
复制
@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删除分隔符之前的任何空格,然后/F的法线可以安全地解析这些值。我选择使用管道(|)作为分隔符。

代码语言:javascript
运行
复制
@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。

代码语言:javascript
运行
复制
@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(
)
票数 2
EN

Stack Overflow用户

发布于 2014-05-05 18:47:59

代码语言:javascript
运行
复制
@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个字符或更多的名称(仅指两个字符),则会失败。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23471592

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档