将来自“for”循环的相同输出定向到两个文件?

Posted

技术标签:

【中文标题】将来自“for”循环的相同输出定向到两个文件?【英文标题】:Directing same output from a 'for' loop to two files? 【发布时间】:2021-11-05 05:50:21 【问题描述】:

任务:使用变量%folder%%wildcards% 搜索驱动器。找到的文件由path-to-file|filesizedatabase.txt 中的条目进行比较。如果找到匹配项,则将其复制到workinglist.txt,如果没有,则创建一个新条目。重点是使用mediainfo提供的存储%duration%数据,大大减少处理时间。

for /r "%folder%" %%a in (%wildcards%) do (
    findstr /i /c:"%%a|%%~za" "%appdata%\df\database.txt" >>%appdata%\df\workinglist.txt || mediainfo --output="General;%%CompleteName%%|%%FileSize%%|%%Duration%%" "%%a" >>%appdata%\df\workinglist.txt
)

问题在于database.txt 应该包含所有可能的数据,而不仅仅是%folder%%wildcards% 指定的数据,这意味着任何新条目都需要添加到workinglist.txt 和@ 987654333@文件。

    如何将来自mediainfo 的数据同时添加到workinglist.txtdatabase.txt 而无需另一个(慢)mediainfo 查询?

    如何将一长行代码拆分为另一行或几行代码以使其更易于阅读和管理?

【问题讨论】:

findstr ... >> workinglist || ( mediainfo ... >> workinglist & mediainfo ... >> database)怎么样 一个 mediainfo 查询使脚本非常慢,执行两次会慢一倍。 findstr ... >> workinglist || for /f %%c in ('mediainfo ...') do ( echo %%c >> workinglist & echo %%c >> database ) ?避免执行 mediainfo 两次 @NahuelFouilleul 不确定如何设置附加 for 循环的选项以使其正确显示。想要将其格式化为答案? 如果您显示几行 workinglist.txtdatabase.txt 会有所帮助。 【参考方案1】:

有几种不同的方法可以解决这个问题。此解决方案对每个新文件仅使用一次 mediainfo 查询:

rem Insert data of new files in newEntries.txt file
del newEntries.txt 2> NUL
for /r "%folder%" %%a in (%wildcards%) do (
    findstr /i /c:"%%a|%%~za" "%appdata%\df\database.txt" >> "%appdata%\df\workinglist.txt"
    if errorlevel 1 (
        mediainfo --output="General;%%CompleteName%%|%%FileSize%%|%%Duration%%" "%%a" >> newEntries.txt
    )
)

rem Add new entries to both database and workinglist
type newEntries.txt >> "%appdata%\df\database.txt"
type newEntries.txt >> "%appdata%\df\workinglist.txt"

【讨论】:

适用于大多数文件,但有时我会收到错误消息“该进程无法访问该文件,因为它正在被另一个进程使用。”,我认为这可能是由于文件名中的特殊字符。现在调查。

以上是关于将来自“for”循环的相同输出定向到两个文件?的主要内容,如果未能解决你的问题,请参考以下文章

如何将“打印”输出重定向到文件?

如果命令输出重定向到日志文件,则cron停止发送错误邮件

for循环中的多个do命令:将字符串回显到文件然后重定向到命令窗口

将输出流以外的两个或多个 Powershell 流重定向到同一个文件

在批处理脚本的for循环中重定向命令的输出

kermit - 如何将输出重定向到文件中