为何CMD中可用的FFmpeg批量转码for循环在PowerShell无法运行?
为什么CMD的FFmpeg批量转换命令在PowerShell中无法运行?
核心原因
PowerShell和CMD是完全独立的命令行环境,语法规则天差地别:
- 你用的
for %f in (*.*) do ...是CMD专属的命令行循环语法,PowerShell不识别这种写法。 - 你添加的
./前缀是PowerShell用来执行当前目录下可执行文件/脚本的语法,但这里的内容是CMD的命令结构,不是可执行文件,导致PowerShell误把*.*当成要执行的命令,自然报错找不到这个"命令"。
解决方法
有两种可行的方式实现批量转换:
方式1:在PowerShell中调用CMD执行原有命令
用cmd /c前缀让PowerShell调用CMD来执行你原本的命令,注意要把命令里的双引号转义成两个双引号:
cmd /c "for %f in (*.mp4) do ""C:\FFMPEG\ffmpeg"" -i ""%f"" -vn -acodec libmp3lame -q:a 2 ""E:\Downloads2\converted\%~nf.mp3"""
方式2:用PowerShell原生语法实现(更推荐)
用PowerShell自带的命令来完成遍历和转换,逻辑更清晰,也更符合PowerShell的使用习惯:
# 先创建转换后的目标文件夹(如果不存在的话) if (-not (Test-Path "E:\Downloads2\converted")) { New-Item -ItemType Directory -Path "E:\Downloads2\converted" | Out-Null } # 遍历当前目录下所有.mp4文件,逐个调用FFmpeg转换 Get-ChildItem -Path . -Filter *.mp4 | ForEach-Object { & "C:\FFMPEG\ffmpeg" -i $_.FullName -vn -acodec libmp3lame -q:a 2 "E:\Downloads2\converted\$($_.BaseName).mp3" }
Get-ChildItem专门用来获取指定目录下的文件,这里只筛选.mp4格式,比*.*更精准ForEach-Object用来遍历每个找到的文件&是PowerShell中调用外部程序(比如FFmpeg)的专用操作符$_.FullName代表当前文件的完整路径,$_.BaseName代表不带扩展名的文件名
内容的提问来源于stack exchange,提问作者thanks_in_advance
相关产品推荐
相关产品推荐

