我在一个目录中有很多 .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
) - 最后将所有内容写入输出文件。
注意:因为它使用了-File
ps3 中引入的。这可以用 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
/B
delims
:
for
: