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

我在树目录结构中设置了5000个CSV文件。 每个文件都是第一行表示其内容,然后是典型的CSV内容。

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

我怎样才能快速收集每个文件的第一行,以监督他们的编码?

我试图用这个答案的帮助,但我不清楚所有的语法细微差别的batch filevariables,所以我得到的东西像Echo is on.

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

如果零件单独执行(对于单个文件),它们工作。

我也在尝试单线

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

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

这里的主要问题是缺少延迟扩展 ,当你在相同的代码块中写入读取一个变量时,这是需要的; 没有它,你正在读取解析块时出现的变量值,所以执行之前 。 这是固定的代码:

 @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 

此外,我引用了所有的文件/目录路径,以避免使用空格或特殊字符的麻烦。 因为echo(!line1! >> "out.txt"也输出了>>前面的空格 ,而不是echo后面的空格看起来很奇怪,但是防止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" 

aschipfl的评论帮助。 为他人的利益添加更正和完成的脚本:

 @echo off copy NUL out.txt SETLOCAL EnableDelayedExpansion for /RD:\resources\ %%g in (*.csv) do ( set /p line1=<%%g echo !line1! >> out.txt )