如何在Windows 10 PowerShell中正确运行FFmpeg批量处理MKV文件的Linux风格命令
在Windows 10 PowerShell中批量运行FFmpeg转码MKV文件的正确方式
你遇到的问题是直接套用了Bash风格的循环语法,但PowerShell的循环结构和Bash完全不同,所以才会抛出那些解析错误。下面是修正后的命令,以及关键修改点的说明:
正确的PowerShell命令(两种方式可选)
方式1:使用管道+ForEach-Object(更符合PowerShell的管道风格)
Get-ChildItem -Path "D:\input\*.mkv" | ForEach-Object { # 如果ffmpeg不在当前工作目录,替换成完整路径,比如 "C:\tools\ffmpeg.exe" ./ffmpeg -i "$($_.FullName)" ` -map 0:v:0 -map 0:a:0 -map 0:a:1 -map 0:s:0 -map 0:s:1 ` -c:v copy -c:a flac -c:s copy ` "D:\output\$($_.Name)" }
方式2:使用foreach语句(更接近传统循环写法)
foreach ($file in Get-ChildItem -Path "D:\input\*.mkv") { ./ffmpeg -i "$($file.FullName)" ` -map 0:v:0 -map 0:a:0 -map 0:a:1 -map 0:s:0 -map 0:s:1 ` -c:v copy -c:a flac -c:s copy ` "D:\output\$($file.Name)" }
关键修改点说明
- 循环语法适配:PowerShell没有Bash那种
for file in ...; do ...; done的写法,而是用foreach ($var in 集合)或者管道结合ForEach-Object来遍历文件。 - 输出路径补全文件名:你原来的命令里输出路径只写了
D:\output,FFmpeg需要明确的输出文件名,这里我们用$($_.Name)(管道方式)或$($file.Name)来保留原MKV文件名,确保每个转码后的文件都能正确保存到输出目录。 - 文件路径引用:在PowerShell字符串中嵌入对象属性时,需要用
$($对象.属性)的格式(比如$($_.FullName)),这样PowerShell才能正确解析变量,避免路径出现语法错误。 - FFmpeg路径问题:如果
ffmpeg.exe不在当前PowerShell的工作目录下,建议替换成完整的可执行文件路径(比如"C:\Program Files\ffmpeg\bin\ffmpeg.exe"),防止出现“找不到命令”的错误。
内容的提问来源于stack exchange,提问作者vivofen578
相关产品推荐
相关产品推荐

