我需要一些帮助和指导。 我有下面的脚本,在文件夹中查找csv文件。将文件的文件名和标头抓取到输出文件。
脚本可以正常工作,但是标题会在输出文件的行尾被切断。如何将整个标题传递给输出文件?
@ECHO OFF &SETLOCAL
for %%a in (*.csv) do (
set "line="
set /p "line="<"%%~a"
SETLOCAL ENABLEDELAYEDEXPANSION
echo %%a %line%":">>output.txt
echo(!line!>> output.txt
endlocal
)
答案 0 :(得分:2)
这取决于你的csv标头的长度。
在您的代码中,您正在使用重定向输入和set /p
读取标头。此方法允许最大输入1022个字符。
您可以使用for /f
来读取文件,但这也仅限于最大命令行长度,在本例中为8192个字符。
@echo off
setlocal enableextensions disabledelayedexpansion
(for /f "tokens=1,2,* delims=:" %%a in ('
findstr /n "^" *.csv ^| findstr /b "[^:]*:1:"
') do (
echo(%%a:
echo( %%c
)) > output.txt
此代码只是使用findstr
命令读取输入文件,计算输出行,并从此输出中仅检索每个文件的第一行。 for /f
使用冒号分割行以检索行中的前三个标记:文件名,行号和行内容。
已修改以适应评论
如上所述,存在一个限制,实际数据与之相撞。
我没有看到防弹纯批处理解决方案,但混合文件可以解决问题
@if (@This==@IsBatch) @then
@echo off
setlocal enableextensions disabledelayedexpansion
call :getBatchFileReference _f0
(
for %%a in (*.csv) do (
echo %%a
<"%%a" cscript //nologo //e:Jscript "%_f0%"
)
) > output.txt
goto :eof
:getBatchFileReference returnVar
set "%~1=%~f0"
goto :eof
@end
WScript.StdOut.WriteLine(WScript.StdIn.ReadLine());
保存为.cmd
或.bat
,该文件包含带有批处理代码的初始区域和带有javascript代码的最终区域。
对于每个csv
文件,批处理部件会将其作为输入重定向到javascript部分以读取第一行并输出它。