windows - 从目录子树中的每个文本文件中提取第一行

标签 windows batch-file windows-10

我在树目录结构中有一组 5000 个 CSV 文件。 每个文件的第一行表示其编码,然后是典型的 CSV 内容。

UTF-8
Key1,"Value 1",
Key2,"Value 2"
etc, etc...

我如何快速收集每个文件的第一行以监督他们的编码集?

我在 this answer 的帮助下尝试这个但我不清楚批处理文件变量的所有语法细微差别,所以我得到了诸如 Echo is on.

for /R D:\resources\ %%f in (*.csv) do (
    set /p line1=<%%f
    echo %line1% >> out.txt
)

如果部分单独执行(对于单个文件),它们会起作用。

我也在尝试单线

for /R D:\resources\ %f in (*.csv) do set /p line1=<%f & echo %line1% >> out.txt

但是这个将从第一个文件收集的值放入每个文件的输出中。

最佳答案

这里的主要问题是缺少delayed expansion。 ,当您在同一代码块中编写 读取变量时需要它;没有它,您将在解析 block 时读取存在的变量值,因此 before 它被执行。这是固定代码:

@echo off
copy NUL out.txt
setlocal EnableDelayedExpansion
for /R "D:\resources" %%g in ("*.csv") do (
    set "line1="
    < "%%~g" set /P line1=""
    >> "out.txt" echo(!line1!
)
endlocal

此外,我引用了所有文件/目录路径以避免其中出现空格或特殊字符的问题。我还反转了 redirection syntax ,因为 echo(!line1! >> "out.txt" 还在 >>> 前面输出 SPACE( 而不是 echo 后面的 SPACE 看起来很奇怪,但可以防止 ECHO is {on|off}。 在读取行时返回!line1! 是空的。

顺便说一句,您最初不需要准备一个空的输出文件 out.txt,您可以简单地将整个 for 循环重定向到输出文件中,一次使用>,假设您在周围放置了一对括号:

@echo off
setlocal EnableDelayedExpansion
> "out.txt" (
    for /R "D:\resources" %%g in (*.csv) do (
        set "line1="
        < "%%~g" set /P line1=""
        echo(!line1!
    )
)
endlocal

要直接在命令提示符下作为单行执行相同的操作,请尝试以下操作:

cmd /V /C (for /R "D:\resources" %g in ("*.csv") do @(set "line1=" ^& ^< "%~g" set /P line1="" ^& echo(!line1!)) ^> "out.txt"

关于windows - 从目录子树中的每个文本文件中提取第一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44354247/

相关文章:

java - 在 Windows 10 上的 WSL2 上使用 JDK 的正确方法是什么?

bash - 你如何在 Windows 上的 Bash 中禁用铃声?

c++ - HTTP_RECEIVE_REQUEST_FLAG_FLUSH_BODY 不复制 http body

javascript - 所有 npm 命令都给出相同的错误 (ENOENT)

windows - 如何在批处理脚本中检查文件/目录是否可写

linux - 带输入的批处理脚本。 ADB 命令、FireStick

python - pyttsx3 模块未显示所有已安装的声音

php : The term 'php' is not recognized as the name of a cmdlet, 函数、脚本文件或可运行程序

windows - 为什么我的 DLL 好像没有被调用?

batch-file - 批量仅显示小数点后 2 个字符