将来自“for”循环的相同输出定向到两个文件?
Posted
技术标签:
【中文标题】将来自“for”循环的相同输出定向到两个文件?【英文标题】:Directing same output from a 'for' loop to two files? 【发布时间】:2021-11-05 05:50:21 【问题描述】:任务:使用变量%folder%
和%wildcards%
搜索驱动器。找到的文件由path-to-file|filesize
与database.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.txt
和database.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.txt
和 database.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”循环的相同输出定向到两个文件?的主要内容,如果未能解决你的问题,请参考以下文章
for循环中的多个do命令:将字符串回显到文件然后重定向到命令窗口