delim命令只读取txt文件的一部分

时间:2017-11-14 10:03:56

标签: batch-file

我是编程的新手。

我有一个包含目录中文件列表的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!

=========================================

任何帮助赞赏:) 谢谢

2 个答案:

答案 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"
        )
    )
)

但是,有以下限制:

  • 单个项目不得超过1021个字符/字节(这是set /P的限制);
  • 领先的白色空间(以及一些尾随的空格)会丢失;
  • 没有字符串必须以=符号开头(如果出现语法错误);