Batch file 绕过Windows批处理文件中字符串的1024个字符限制
我有一个BAT文件,它解析出CSV文件的头,用下划线替换空格,然后合并一系列CSV文件。问题是,我的头文件很长,被截断为1024个字符。有人有什么建议吗?如果可能的话,我希望不必去PowerShell或基本批处理编程以外的任何地方 唯一的问题是标题Batch file 绕过Windows批处理文件中字符串的1024个字符限制,batch-file,Batch File,我有一个BAT文件,它解析出CSV文件的头,用下划线替换空格,然后合并一系列CSV文件。问题是,我的头文件很长,被截断为1024个字符。有人有什么建议吗?如果可能的话,我希望不必去PowerShell或基本批处理编程以外的任何地方 唯一的问题是标题 @ECHO OFF set Outputfolder=c:\Test REM Get the header string out of one of the files for %%I in (%outputFolder%\*_stats.csv)
@ECHO OFF
set Outputfolder=c:\Test
REM Get the header string out of one of the files
for %%I in (%outputFolder%\*_stats.csv) do set /p HeaderString=< %%I
REM replace the spaces in that header string with underscores
SET HeaderString=%HeaderString: =_%
REM write that header as the first line of the output file
echo.%HeaderString%>%outputFolder%\all_stats_merged.csv
REM append the non-header lines from all the files
>>%outputFolder%\all_stats_merged.csv (
for %%I in (%outputFolder%\*_stats.csv) do more +1 "%%I"
)
尽管您倾向于避开PowerShell,但如果可能,尝试一下以下.ps1,看看它是否有助于更改您的偏好: $First=$True GCI'C:\test\*_stats.csv'|%{$csv=$_ $Lines=$Lines=GC$Csv $Write=开关$First{$True{$Line=$Lines |选择-First 1 $Line。替换“”,“”“ $First=$False} $False{$Lines |选择-跳过1} AC'C:\test\all\u stats\u merged.csv'$Write} 为完整起见,这里有一个未经测试的批处理文件尝试使用FindStr,最多8191个字符**: @回音 设置OutputFolder=C:\Test 固定头串= 对于/F标记=3*Delims=:%%A 'FindStr/N^%OutputFolder%\*\u stats.csv 2^>num'Do If%%A==1 如果未定义HeaderString,则设置HeaderString=%%B 调用Echo%%HeaderString:=\u%%Else Echo%%B >>%OutputFolder%\all\u stats\u merged.csv 上面的.cmd文件是使用包含驱动器规格的%OutputFolder%设计的;如果其最终值没有驱动器号,则需要将Tokens=3*更改为Tokens=2*
**但是,8191个字符将包括每个文件的完整文件路径、每行行号和两个冒号分隔符。您的问题是使用SET/p读取标题行,标题行限制为1021个字符,而不是1024个字符。有关更多信息,请参见以及 如果切换到可读取~8k的FOR/F,则很容易解决此问题
for %%A in (%outputFolder%\*_stats.csv) do for /f "usebackq delims=" %%B in ("%%A") do (
set "HeaderString=%%B"
goto :break
)
:break
通常,当你达到这样的极限时,是时候怀疑你是否仍在使用适合这项工作的工具了。@Compo,据我所知,SET/P仅处理1024个。您的另一个选项是使用FOR/F命令读取其中一个csv文件,并将文件的第一行指定给一个变量,然后使用GOTO命令中断FOR命令。@Squashman-您解决了问题,尽管限制是1021,而不是1024。您发表评论时,我正在写我的答案。@dbenham,我还警告用户在上一个问题中有更多的命令限制。我的解决方案是将文件重定向到FIND命令中,并使用原始头变量作为反向查找。查找/I/V%oheader%