Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/batch-file/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Batch file 绕过Windows批处理文件中字符串的1024个字符限制_Batch File - Fatal编程技术网

Batch file 绕过Windows批处理文件中字符串的1024个字符限制

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)

我有一个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)  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%