batch-file - 文件夹内的批处理文件创建 MediaInfo.nfo 文件

标签 batch-file directory mediainfo

我正在尝试创建一个批处理,其目的是使用 MediaInfo.exe (CLI) 创建单个文本文件 (.nfo),其中包含文件夹中包含的视频文件的所有“mediainfo”。

批处理是从上下文菜单中执行的:右键单击包含视频文件的文件夹。 为此,该文件将被放置在“shell:sendto”中。

生成的包含所有媒体信息的 .nfo 文件必须“放置/保存或移动”到包含视频文件的文件夹中。

一个特殊之处是我需要更改最终的 .nfo 文件,以便删除“完整名称”行的所有路径部分:

Complete name                            : /Users/me/Downloads/Folder1/Folder2/RÉCENTS/[File] File Name - 185  (Encode Format 1080p).mkv

在此示例中:执行搜索并替换以仅保留:

Complete name                            : [File] File Name - 185  (Encode Format 1080p).mkv

目前,我已成功创建此批处理(链接如下)。 这个有一些错误,即:

  • 找不到文件 (x2)
  • 如果存在特殊字符,Powershell 会出现错误

总结按批处理搜索的过程:

1.右键单击包含文件的文件夹>发送到>单击批处理文件。

2.创建文件夹中包含的文件的所有媒体信息txt文件

3.通过在每个内容之间添加分隔符“----”来合并媒体信息txt文件。

4. 使用正则表达式搜索并替换最终文件,以删除文件名之前的所有路径,然后将 (.nfo) 保存在文件夹内。

5.清理第 2 步中的旧临时文件。

The actual Batch files I managed to create :

@echo off
 
:: Fullpath current folder : %cd%
:: Fullpath folder where the right click was made : %~f1
:: Name of the folder where the right click was made : for %%f in ("%~f1") do set Name=%%~nxf
 
for %%f in ("%~f1") do set Name=%%~nxf
 
:: Step 1: Creating a temporary folder
mkdir "%~f1-Temp"
 
:: Step 2: Creation of all nfo txt files in the temporary folder
FOR /F "tokens=*" %%G IN ('dir "%~f1" /b *.mkv') DO (
   call "C:\Users\me\Desktop\MediaInfo\MediaInfo.exe" "%~f1\%%G" > "%~f1-Temp\%%~nG.txt"
)
 
:: Step 3: Filling in the final nfo
setlocal enabledelayedexpansion
set i=0
 
FOR /F "tokens=*" %%G IN ('dir "%~f1" /b *.mkv') DO (
   IF !i! == 1 (
     echo ------------------------------------------------------------------------------------------------------------------------------------ >> "%~f1-Temp\%Name%.txt"
     echo. >> "%~f1-Temp\%Name%.txt"
     echo. >> "%~f1-Temp\%Name%.txt"
  )
   cat "%~f1-Temp\%%~nG.txt" >> "%~f1-Temp\%Name%.txt" 
   set i=1
)
endlocal
 
:: Step 4: Removing the path
setlocal
set $source="%~f1-Temp\%Name%.txt"
set $dest="%~f1-Temp\%Name%1.txt"
set "search=%~f1\\"
 
for /f "delims=" %%a in ('powershell -c "(get-content '%$source%') | foreach-object {$_ -replace '(?<=Complete name\s+:\s+).+\\'} | set-content '%$dest%'"') do echo %%a
endlocal
 
:: Step 5: Renaming the nfo and moving to the right place
Ren "%~f1-Temp\%Name%1.txt" "%Name%.nfo"
move "%~f1-Temp\%Name%.nfo" "%~f1"
 
:: Step 6: Deleting temporary files
rmdir /s /q "%~f1-Temp"
 
pause

如果您对已编码的内容有改进或/和更正的建议,请不要犹豫! 预先感谢您的帮助!

最佳答案

我认为您通过向 MediaInfo 提供完整路径作为参数,自己创建了一个问题。如果您仅向其提供文件名,则完整名称将仅反射(reflect)文件名。

此外,除非我误解了您的意图,否则当我认为没有必要时,您就在跳过许多麻烦。

应在您常用的脚本目录中创建以下示例批处理文件,如果您愿意,甚至可以在“文档”目录中创建。

然后您应该在“SendTo”目录中创建它的快捷方式,并为其指定一个您可以理解的名称,例如 MediaNFO

现在您需要做的就是右键单击您的目录并选择发送到MediaNFO。这应该在右键单击的目录中创建一个文件,其名称与该目录相同,并且包含它所包含的每个受支持文件的 mediainfo 输出。 完整名称行不应包含路径信息,仅包含文件名

@Echo Off
SetLocal EnableExtensions

Set "MIExe=%UserProfile%\Standalone\MediaInfo\MediaInfo.exe"
Set "OutExt=nfo"
Set "HR=------------------------------------------------------------------"

For %%G In ("%~1") Do If "%%~aG" Lss "d" (If "%%~aG" GEq "-" (
        Echo Error! File arg.
        GoTo EndIt) Else (Echo Error! Invalid directory arg.
        GoTo EndIt)) Else If "%%~dG" == "" (
    Echo Error! Full directory path required.
    GoTo EndIt)

If Not Exist "%MIExe%" (Echo Error! MediaInfo not found.
    GoTo EndIt)

PushD "%~1"

Set "ExtLst="
For %%G In (aac ac3 aifc aiff ape asf au avi avr dat dts flac iff ifo irca m1v
    m2v mac mat mka mks mkv mov mp2 mp3 mp4 mpeg mpg mpgv mpv ogg ogm paf pvf qt
    ra rm rmvb sd2 sds vob w64 wav wma wmv xi) Do If Not Defined ExtLst (
    Set "ExtLst=".":"*.%%G"") Else Call Set "ExtLst=%%ExtLst%% ".":"*.%%G""

Set "}=%PATHEXT%" && Set "PATHEXT="
%SystemRoot%\System32\where.exe /Q %ExtLst%
If ErrorLevel 1 (Echo Error! Directory has no supported files.
    GoTo EndIt)

Set "i="
(For /F "Delims=" %%G In ('%SystemRoot%\System32\where.exe %ExtLst% 2^> NUL'
) Do (If Defined i Echo %HR%
    "%MIExe%" "%%~nxG"
    Set "i=T")) 1> "%~nx1.%OutExt%"

:EndIt
%SystemRoot%\System32\timeout.exe /T 3 /NoBreak 1> NUL
GoTo :EOF

您可以更改第 4mediainfo.exe 的位置,以及第 5 行的输出扩展名;但其他任何内容都不应修改。

您还应该注意,我已为此脚本添加了一些输入验证。如果您的输入目录不是包含现有 mediainfo 可执行文件的支持文件的完全限定目录路径,它将报告错误并关闭。

关于batch-file - 文件夹内的批处理文件创建 MediaInfo.nfo 文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66190788/

相关文章:

bash - 服务器重启后windows批处理文件启动浏览器

batch-file - 批处理文件 For 循环遍历具有排除项的文件扩展名列表

C# ClickOnce 安装文件夹 - Windows 如何生成文件夹名称

android - 可以转换或流式传输 (Android-Chromecast) 本地文件吗?

batch-file - 重命名隐藏和系统文件命令

windows - 在指定时间后停止批处理脚本的最佳方法是什么?

python - 在 Python 中使用 listdir 时出错

azure - Azure DevOps' C :\agent\_work\1\a? 中最后一个字母 "a"、 "b"或 "s"的含义是什么有人知道最后一个字母代表什么吗?

ffmpeg - 从视频文件中提取 vanc 数据/帧 hexdump

task.arguments 中的 Swift 参数