由于"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
那么解决方案是什么呢?
看起来是固定宽度的列,每列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实用程序将数据从固定宽度转换为分隔格式,而不是处理删除尾部空格的问题。REPL.BAT是一个混合的JScript/批处理实用程序,它对stdin执行正则表达式搜索/替换操作,并将结果写入stdout。这是一个纯脚本,从XP开始,它将在任何现代Windows机器上运行,而不需要任何第三方可执行文件。完整的文档嵌入在脚本中。
我会使用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(
)
@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个字符或更多字符的用户名(仅命名两个(,将失败。
感谢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个空格作为一个好的分隔符。并且我们不担心用户名中间的空格。最后,您应该解析三个令牌。不仅仅是一个代币。谢谢你们的关注。