【问题标题】:Batch code to read text file读取文本文件的批处理代码
【发布时间】:2013-09-14 20:32:08
【问题描述】:

我有一个批处理文件,它将所有可用驱动器的列表写入一个文本文件和 另一个批处理文件来读取该文本文件中的内容(跳过第一行)

驱动列表代码为:

wmic logicaldisk get name> "abc.txt

用于读取文本文件的代码是:

FOR /F "skip=1" %%m IN (abc.txt) DO (echo %%m)

只有手动创建文件时,阅读器批处理才有效,为什么??

需要一些解决方案,请帮忙!

【问题讨论】:

  • 不需要追加模式>>重定向。普通> 在这种情况下工作正常。

标签: batch-file filereader


【解决方案1】:

问题在于 wmic 正在输出 UTF-16 格式,该格式由文件 (Hex Dump Tool) 开头的 FF FE 指示。命令 FOR 无法理解 Unicode 格式并且没有找到任何内容。

您需要一个中间步骤将 abc.txt 转换为纯文本。这解释了为什么当您以纯文本格式手动创建文件时,它会按预期工作。将以下内容添加到将执行转换的第二个批处理文件中。

    TYPE abc.txt > abcplain.txt
    FOR /F "skip=1" %%m IN (abcplain.txt) DO (echo %%m)

【讨论】:

    【解决方案2】:

    正如 miltonb 所说,WMIC 输出采用带有 BOM 的 unicode UTF-16 格式。

    FOR /F 不喜欢 unicode。您可以使用 TYPE 将 unicode 转换为 ANSI。注意 IN() 子句用单引号括起来,所以 FOR /F 读取命令的输出而不是文件。

    FOR /F "skip=1" %%m IN ('type abc.txt') DO (echo %%m)
    

    编辑

    可以将您的 WMIC 命令直接放在 FOR /F IN() 子句中,完全不需要临时文件。

    虽然 FOR /F 无法读取 unicode 文件,但它可以直接处理 WMIC 的 unicode 输出。不幸的是,它引入了附加到每一行的额外回车的工件(我不知道为什么)。这可能会导致解析问题。有多种方法可以处理这个问题。我最喜欢的是使用一个额外的 FOR /F 循环来去除每一行的终止回车。

    请注意,第二个 FOR /F 在 IN() 子句中使用双引号使其读取字符串。

    for /f "skip=1" %%A in ('wmic logicaldisk get name') do for /f %%B in ("%%A") do echo %%B
    

    【讨论】:

    • 这是 '' dbenham 的一个很酷的把戏,我不知道那个。
    • 我们如何让代码始终指向最后一行(跳过所有其他行)
    • @user2765512 - 最简单的解决方案是让 FOR /F 循环将变量设置为等于每行的值。最后一行获胜:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-02
    • 2012-02-27
    • 1970-01-01
    • 2014-05-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多