我是编程的新手。
我有一个包含目录中文件列表的txt fileA。
方案: 我正在运行delim命令来删除新的行特殊字符代码,并用txt fileA中的jpg文件名(cicra 10000)列表中的逗号替换,并将结果输出到输出fileB。
问题: 只有随机数量的文件名到达输出文件!有些人或许多人失踪了。
这是代码......
========================================
dir /o /b > fileA.txt
set "txt="
for /f "delims=" %%a in (fileA.txt) do (
set "txt=!txt!%%a,"
)
set "txt=!txt:~0,-1!"
>fileB.txt echo !txt!
=========================================
任何帮助赞赏:) 谢谢
答案 0 :(得分:0)
阅读Microsoft支持文章Command prompt (Cmd. exe) command-line string limitation,该文章解释了为什么并非所有文件名都附加到环境变量txt
这么大的文件名列表中。
一种解决方法是将文件名写入文本文件,并使用工具以逗号替换所有回车符+换行符对。
以下是使用此解决方法的两种解决方案 How can you find and replace text in a file using the Windows command-line environment?
@echo off
rem Replace using very fast Xchang32.exe written by Clay Ruth.
dir *.jpg *.jpeg /A-D /B /ON >ImageList1.txt
"%~dp0Xchang32.exe" ImageList1.txt "^x0D^x0A" ",," >nul
rem Replace using a bit slower jrepl.bat written by Dave Benham.
dir *.jpg *.jpeg /A-D /B /ON >ImageList2.txt
call "%~dp0jrepl.bat" "\r\n" "," /M /F ImageList2.txt /O -
由 Dave Benham 撰写的 Clay Ruth 或 jrepl.bat 撰写的Xchang32.exe 必须保持一致目录作为批处理文件。
注1:
图像列表文件的内容以逗号结尾在两个解决方案上,因为 DIR 输出的最后一行也以回车+换行结束。
我还尝试了以下命令行:
call "%~dp0jrepl.bat" "\r\n(?=.)" "," /M /F ImageList2.txt /O -
带有替换字符串\r\n(?=.)
的正则表达式搜索字符串,
在支持PRE语法中的正则表达式的文本编辑器中工作,这不会替换文件中的最后一个回车+换行符,因为正向前瞻对于除了换行符之外的任何字符在最后一个CR + LF上都不是真的,但是使用Microsoft的JScript(至少在Windows XP上)不能与jrepl.bat
一起使用。
注2:
在 DIR 命令行上不使用*.jpg *.jpeg
时,建议创建不在 DIR 搜索任何名称文件的目录中的图像列表文件,因为在这种情况下,列表文件也将包含在列表中。
重要说明: Xchang32.exe 的作者Clay Ruth和域clayruth.com
的所有者多年前去世了。出于这个原因,使用此工具的ZIP文件在万维网上不再可用,尽管明确允许根据ZIP文件中的read me文件免费分发此软件包。
答案 1 :(得分:0)
问题是您正在收集单个字符串中的所有数据,因此您可以在Windows命令提示符cmd
中快速达到字符串大约8190个字符/字节的限制。
解决这个问题的一种方法是使用set
/P
,它旨在使用显示消息提示用户输入变量的值;输出此消息时没有任何尾随换行符:
> "fileA.txt" dir /O /B
> "fileB.txt" < nul (
set "FLAG=#"
for /F "usebackq delims= eol=|" %%a in ("fileA.txt") do @(
if defined FLAG (
set /P ="%%a"
set "FLAG="
) else (
set /P =",%%a"
)
)
)
实际上您不需要临时文件fileA.txt
:
> "fileB.txt" < nul (
set "FLAG=#"
for /F "delims= eol=|" %%a in ('dir /O /B') do @(
if defined FLAG (
set /P ="%%a"
set "FLAG="
) else (
set /P =",%%a"
)
)
)
但是,有以下限制:
set /P
的限制); =
符号开头(如果出现语法错误);