【问题标题】:Windows batch file processing a single line in a file twice involving two different delimiters [closed]Windows批处理文件处理文件中的单行两次,涉及两个不同的分隔符[关闭]
【发布时间】:2022-01-24 00:07:17
【问题描述】:

我尝试创建一个 Windows 批处理脚本文件,它将处理以下文本 (.txt) 文件内容:

SampleTextfile.txt:

John Doe$Jane Doe
Marky Mark$Justin Timberlake
Elvis Presley$Sarah Madden
Rufus Deer$Kerry John (bible.com) (Megaducks) (TruesomeWind)

目标是:

  1. 删除直到第一个 $ 分隔符的所有内容,同时删除分隔符本身,这将导致:

    Jane Doe
    Justin Timberlake
    Sarah Madden
    Kerry John (bible.com) (Megaducks) (TruesomeWind)
    
  2. 从第二个 ( 分隔符中删除所有内容,同时删除分隔符本身,这会导致:

    Jane Doe
    Justin Timberlake
    Sarah Madden
    Kerry John
    

在以下代码中,第二个分隔符的命令行生成一个没有错误消息的空文件:

@ECHO OFF
SETLOCAL
( FOR /f "tokens=1*delims=$" %%a IN (SampleTextfile.txt) DO ECHO( %%b

"tokens=1 delims=(" %%b

)>SampleTextfileV2.txt
TYPE SampleTextfileV2.txt
GOTO :EOF

有人可以告诉我必须在代码中更改什么而不是 "tokens=1 delims=(" %%b 才能获得第二个目标吗?

【问题讨论】:

  • DOS 6.22 还是现代 CMD? DOS 没有for /f 循环。
  • 如果您使用的是现代 Windows 操作系统而不是 MS-DOS,您可以使用它。 FOR /F "usebackq tokens=2 delims=$(" %%G IN ("SampleTextfile.txt") DO ECHO %%G
  • 您是真的在使用 MS DOS 还是您指的是 Windows 中的命令行? (后者与 MS-DOS 完全无关
  • 所有,在我的笔记本电脑上安装的 Microsoft Windows 10 Home 中,我打开了 MS Dos 命令行(Microsoft Windows [版本 10.0.19042.1415]),我正在运行上述批处理以纯数据文本文件作为输入的脚本 (.bat)。您能否更正上述列出的代码?
  • @renovialand 我给了你一个代码修复。你没试过吗?不管命令行不是 MS-DOS。 DOS是一个操作系统。 CMD.exe 只是一个外壳。

标签: windows batch-file cmd


【解决方案1】:

该任务可以通过以下由 Windows 命令处理器 cmd.exe 解释的 Windows 批处理文件来完成。

@echo off
setlocal EnableExtensions DisableDelayedExpansion
if not exist "%~dp0SampleTextfile.txt" echo Missing file SampleTextfile.txt in: "%~dp0"& goto :EOF
(for /F "usebackq tokens=2 delims=$(" %%G in ("%~dp0SampleTextfile.txt") do echo(%%G)>"%~dp0SampleTextfileV2.txt"
type "%~dp0SampleTextfileV2.txt"
endlocal

上面的代码适用于批处理文件目录中的文件,其路径由%~dp0 引用,与执行批处理文件时哪个目录是当前目录无关。 %~dp0 引用参数 0 的驱动器和路径,即批处理文件本身。在 Windows 命令提示符窗口call /? 中运行以显示此命令的帮助,解释如何引用批处理文件参数。 %~dp0 扩展为始终以反斜杠结尾的批处理文件目录路径。因此,%~dp0 与文件名连接在一起,没有额外的反斜杠。

以下代码也可以用于当前目录中的文件,可以是任何目录。

@echo off
setlocal EnableExtensions DisableDelayedExpansion
if not exist "SampleTextfile.txt" echo Missing file SampleTextfile.txt in: "%CD%"& goto :EOF
(for /F "usebackq tokens=2 delims=$(" %%G in ("SampleTextfile.txt") do echo(%%G)>"SampleTextfileV2.txt"
type "SampleTextfileV2.txt"
endlocal

FOR 使用选项/F 将双引号中的字符串解释为要逐行打开和处理的文本文件的名称,因为usebackqFOR 总是忽略空行。

非空行被分割成子串。选项delims=$( 指示FOR$( 解释为字符串分隔符,而不是默认情况下的普通空格和水平制表符。因此,$( 的任何系列都被解释为字符串分隔符。

让我们看看文本文件的最后一行发生了什么:

Rufus Deer$Kerry John (bible.com) (Megaducks) (TruesomeWind)

delims=$( 的行拆分会产生以下子字符串(令牌):

  1. Rufus Deer
  2. Kerry John ...请注意尾随空格!
  3. bible.com) ...请注意尾随空格!
  4. Megaducks) ...请注意尾随空格!
  5. TruesomeWind)

下一个 FOR 查找第一个子字符串 Rufus Deer 的第一个字符。如果该字符串以默认的行尾字符 ;(分号)开头,则 FOR 将忽略该行以进行进一步处理。

tokens=2 选项指示 FOR 默认情况下不将第一个子字符串分配给指定的循环变量 G,而是将上面示例中的第二个子字符串 Kerry John 尾随空格。

在这种情况下,FOR 也会忽略没有第二个子字符串的行。

因此,每行的第二个子字符串被分配给循环变量G,并执行命令ECHO以输出字符串以处理STDOUT。命令 ECHO 和循环变量引用 %%G 之间的左圆括号 ( 是通常使用的空格字符的替代品,以得到正确的输出,并且字符串也只有空格/制表符由 ECHO 而不是打印命令 echo 模式的当前状态来处理 STDOUT

ECHO 在处理 FOR 文本文件中的行时输出的所有字符串都使用 > 重定向到文件 SampleTextfileV2.txt 中,该文件始终是新创建的已经存在并且没有像只读属性那样被写保护。

也可以使用以下批处理文件进行真正的两步处理,尽管根据发布的示例不是必需的:

@echo off
setlocal EnableExtensions DisableDelayedExpansion
if not exist "SampleTextfile.txt" echo Missing file SampleTextfile.txt in: "%CD%"& goto :EOF
(for /F "usebackq tokens=1* delims=$" %%G in ("SampleTextfile.txt") do for /F "delims=(" %%I in ("%%H") do echo(%%G)>"SampleTextfileV2.txt"
type "SampleTextfileV2.txt"
endlocal

要了解所使用的命令及其工作原理,请打开command prompt 窗口,在那里执行以下命令,并仔细阅读每个命令显示的所有帮助页面。

  • call /? ... 对于%~dp0
  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • set /? ... 对于%CD%
  • setlocal /?
  • type /?

另请参阅single line with multiple commands using Windows batch file 以了解此处使用的运算符 & 的说明强>goto.

【讨论】:

    猜你喜欢
    • 2022-12-14
    • 2014-02-21
    • 2017-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-04
    相关资源
    最近更新 更多