Windows 批处理中的 FOR 命令和制表符分隔符

5

我正在尝试使用Windows批处理中的FOR命令

如何指定TAB字符作为分隔符?默认情况下是空格和制表符,但我只需要制表符。

我已经尝试过这个方法,但它没有起作用:

FOR /F "tokens=3 delims=^T" %i in (test.txt) do @echo %i

看起来它是在T字符上进行分割,而不是在制表符上。我还尝试了将文字直接粘贴到命令提示符中,但是出现了语法错误。

4个回答

9

您需要在引号选项字符串中使用一个字面的制表符。字面制表符在批处理文件和命令行上均有效。

如果您试图在命令行中键入一个制表符,那么文件名完成可能会挫败您的努力。您可以使用 CMD /F:OFF 来禁用名称完成。然后您就可以输入一个字面制表符。

尝试将制表符输入到批处理脚本中时,您也可能会遇到问题,这取决于您所使用的文本编辑器。一些程序员编辑器具有自动将 TAB 转换为空格的设置。您需要确保您的编辑器没有这样做。

因此,您只需要更改您的 "tokens=3 delims=^T" 字符串,以使用一个制表符字面值而不是 ^T


5

哎呀呀,这个下午头疼死我了...

今天我也遇到了同样的问题... 我需要解析带有 FOR /F 的行,每行都是由若干句子组成(每个句子可能包含空格),每个句子之间用制表符(TAB)分隔。

我的问题是,即使是在批处理文件中,我的公司编码标准也禁止在源代码中使用实际的 TAB 字符(我们的编辑器不允许输入 TAB,而我们的版本控制工具则不允许将任何包含 TAB 或 WTR [white-to-the-right] 的文本文件提交检查。)

所以,虽然这是一种 hack,但它能在 XP 上运行(低头...深感羞愧...)

SET REG_CPU="HKLM\Hardware\Description\System\CentralProcessor\0"
REG.EXE QUERY %REG_CPU% /V IDENTIFIER | FIND "REG_SZ" > RegCPUid.Tmp
for /F "tokens=2 delims=rR" %%i in (RegCPUid.Tmp) do SET TAB=%%~i

这个可以在XP上运行,但我还没有检查过Win7或Win7[WoW64]。

RegCPUid.Tmp的临时内容为一行,看起来像:

"    IDENTIFIER<tab>REG_SZ<tab>x86 Family 6 Model 37 Stepping 2"    

FOR命令只是简单地取出IDENTIFIER和REG_SZ之间孤独的,并将其设置为环境变量。
然后,我的脚本可以通过FOR /F循环使用作为分隔符(而不是空格),从而实现所有所需操作。
for /F "tokens=1-3* delims=%TAB%" %%i in (Sentences.txt) do ECHO The THIRD sentence is %%k

所有这些都使得我不需要在批处理文件中使用任何硬编码的制表符。
-Dave

delims=%TAB% 是我正在寻找的。谢谢! - RK Coder

4
似乎字面上的制表符可以运行,但是你必须使用/F:ON启动cmd进程。如果没有这个,即使粘贴一个制表符也不起作用。

1
在批处理文件中,字面上的TAB可以正常工作。如果您想在命令行中键入一个TAB字面值,则实际上需要CMD /F:OFF。 - dbenham

0

3
你在哪里看到的?它说默认值是<tab><space>。 - jterrace
1
jterrace 是正确的,缺省分隔符是 <tab><space>。只需从命令行键入 HELP FOR 并阅读 DELIMS 选项的描述即可。 - dbenham

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接