命令行:按日期连接多个文件

命令行:按日期连接多个文件

我在一个目录中有很多 .txt 文件。该目录还包含 .png 和一些 .pdf 文件。我已使用以下命令成功连接了 .txt 文件:

@ECHO Off
SETLOCAL
for /r %%f in (*.txt) do (
echo.
type "%%f"
)>> output.doc

GOTO :EOF

上述命令是从某个在线网站获得的。此命令将按字母顺序连接 .txt 文件。但我不希望这样,我希望它按修改或创建日期完成(建议修改)。我得到一个提示,该行

for /r %%f in(*.txt) do ( 

必须进行修改才能按日期连接。我是这个命令行或批处理脚本的新手,所以我对此了解不多。我应该怎么做。感谢大家的回答。

抱歉第一次没有包含这个问题。根据我之前问过的另一个问题,我还有一个要求(问题)我有一个批处理文件,用于连接 .txt 文件并在每个文件顶部添加两行(一行用于写入不带扩展名的文件名,另一行用于写入与连接文件相关的日期)。有人可以修改下面的批处理文件以按修改日期的顺序连接 .txt 文件并在每个文件的顶部添加两行。

@echo off
SETLOCAL
for /r %%f in (*.txt) do (
echo File Name   : %%~nf 
FOR /f %%d IN ("%%~tf") DO echo Date        : %%d
echo.
type "%%f"
) >> output_text.doc

GOTO :EOF

每个问题都解决了最终的批处理文件:

@echo off
setlocal enableextensions disabledelayedexpansion

set "root=%cd%"

>"output.doc" (
    for /f "tokens=1,2,*" %%a in ('
        robocopy "%root%\." "%root%\." *.txt /l /s /is /ts /ndl /njh /njs /nc /ns 
        ^| sort 
    ') do (
     echo( %%~nc
     for /f "tokens=1-3 delims=/" %%d in ("%%a") do echo %%f/%%e/%%d
     type "%%~fc"
    )
)

答案1

@echo off
    setlocal enableextensions disabledelayedexpansion

    set "root=%cd%"

    >"output.doc" (
        for /f "tokens=2,*" %%a in ('
            robocopy "%root%\." "%root%\." *.txt /l /s /is /ts /ndl /njh /njs /nc /ns 
            ^| sort 
        ') do type "%%~fb"
    )

这将用于获取指示根文件夹下的robocopy所有文件的列表。.txt

生成的文件列表包括文件的最后修改日期。robocopy以 格式打印 UTC 时间yyyy/mm/dd hh:mm:ss,以便列表可以正确排序。

代码的其余部分只是一个for /f处理最终列表的命令,检索文件引用并键入它。完整命令被重定向到输出文件,以避免对每个处理的文件进行打开/关闭操作。

編輯因为需要在最终输出中包含文件名和时间戳......

@echo off
    setlocal enableextensions disabledelayedexpansion

    set "root=%cd%"

    >"output.doc" (
        for /f "tokens=1,2,*" %%a in ('
            robocopy "%root%\." "%root%\." *.txt /l /s /is /ts /ndl /njh /njs /nc /ns 
            ^| sort 
        ') do (
            echo(%%~nc
            echo(%%a %%b [%%~tc]
            type "%%~fc"
        )
    )

tokens子句已被更改为检索时间戳,robocopy以便我们可以将其包含在输出中。%%a将保存日期、%%b时间和%%c带有完整路径的文件名。

对于每个文件,首先回显不带扩展名的文件名 ( %%~nc),然后回robocopy显时间戳,并且为了进行比较,因为 robocopy 的输出是 UTC 时间,所以回显文件时间戳 ( %%~tc)。然后输入文件。

与以前一样,所有输出都被重定向到最终文件。

答案2

Powershell(3-参见注释)一行:

gci *.txt -Recurse -File |sort -Property LastWriteTime |% {(gc $_) + "`n"} >output.doc

  • 它首先列出所有匹配的文件(gci
  • 然后按修改日期排序(sort
  • 然后获取文件内容并为每个内容添加换行符 ( gc)
  • 最后将所有内容写入输出文件。

注意:因为它使用了-Fileps3 中引入的。这可以用 Ps2 语法重写,但它更冗长。

编辑:根据 OP 的要求:修改 {(gc $_) + "`n"} 为:

{"$($_.basename)`n$(get-date -u %d/%m/%Y $_.lastwritetime)`n$(gc $_)`n"}


(这次使用字符串插值来显示各种选项)

旁注:[可能] 文件编码不一致且问题未处理。


答案3

for /f "delims=:" %f in ('dir *.txt /O:D /T:W /B') do @echo %f

此命令将使用最后写入日期 ( ) 和裸格式 ( ) 按dir从最旧到最新的日期 () 排序以仅返回文件名。在命令中设置to可防止它尝试根据空格或逗号解析文件名,因为文件名中不允许出现空格或逗号。/O:D/T:W/Bdelims:for:

相关内容