目录中每个文件的带有 mediainfo 命令的 Powershell

Powershell with mediainfo command for each file in directory

我正在尝试对一个文件夹中的多个媒体文件执行命令:.\mediainfo.exe --Output=XML "$path\file\*.*" > .\file$output.xml。这是我目前拥有的:

$path = get-item F:\Desktop\work\
cd $path
$output = (Get-ChildItem '.\file\*.*').Basename
.\mediainfo.exe --Output=XML "$path\file\*.*" > .\file$output.xml

我的问题是 MediaInfo.exe 将在 XML 上创建包含文件夹 F:\Desktop\work\file.

中所有媒体的所有信息的输出文件

我尝试了以下方法:

$path = get-item F:\Desktop\work\
$dir = get-item $path\file | ? {$_.PSIsContainer}
cd $path
$output = (Get-Item '.\file\*.*').Basename
ForEach ($d in $dir){.\mediainfo.exe --Output=XML "$d" > .\file$output.xml
}

但同样的事情。 output.xml 的名称将与所有媒体名称连接在一起。例如,如果我有两个文件名 audio1.aif 和 audio2.aif,我的 XML 的名称将是 audio1 audio2.xml

知道如何实现吗?谢谢

也许我遗漏了问题中的某些内容,但是对于一个 sidecar XML 文件,其文件名是源文件名 +“.xml”,这个小脚本可以做到:

ForEach ($d in get-item "file\*.*"){
  .\mediainfo.exe --Output=XML "$d" > "$d.xml"
}

注意:生成的MediaInfo XML 将具有绝对文件名(包括路径),因为绝对文件名已提供给MediaInfo。如果您更喜欢相对文件名(没有当前路径,也没有包含文件的目录名),您需要提供相对文件名:

$current = (Get-Item .).FullName
cd file
ForEach ($d in Get-Item "*.*"){
  $filename = Split-Path "$d" -Leaf
  ..\mediainfo.exe --Output=XML $filename > "$d.xml"
}
cd $current

如果您想要 XML 没有源文件扩展名的文件(不推荐,如果您得到 2 个具有相同基本名称的文件,例如 a.avi 和 a.srt sidecar 字幕文件,请发出对于第一个文件),你需要一个中间变量:

$current = (Get-Item .).FullName
cd file
ForEach ($d in Get-Item "*.*"){
  $filename = Split-Path "$d" -Leaf
  #$basename = Split-Path "$d" -LeafBase #Only in newest versions
  $basename = (Get-Item -Path "$d").BaseName
  ..\mediainfo.exe --Output=XML $filename > "$basename.xml"
}
cd $current