如何在递归PowerShell循环中自动应答覆盖提示?
如何在递归PowerShell循环中自动应答覆盖提示?
看起来你遇到的问题根源其实是ffmpeg的覆盖确认提示,而不是PowerShell的Remove-Item命令——这就是为什么你之前尝试的echo y |和Remove-Item -Force都没解决问题。让我给你几个可行的解决方案:
1. 给ffmpeg添加自动覆盖参数(最直接的解决办法)
ffmpeg本身有一个-y参数,作用是自动确认覆盖任何已存在的输出文件,完全跳过交互提示。你只需要把这个参数加到ffmpeg命令的最前面:
Get-ChildItem -Filter *.mp4 -Recurse | % { ffmpeg -y -i $_.FullName -vf "scale='if(gt(ih,iw),360,-2)':'if(gt(iw,ih),360,-2)'" "$($_.FullName)_scaled.mp4" && Remove-Item $_.FullName }
这个参数会让ffmpeg在遇到已存在的_scaled.mp4文件时直接覆盖,不会弹出任何提示。
2. 提前跳过已处理的文件(更高效的做法)
如果你不想重复处理已经完成缩放的文件(毕竟重新覆盖也是浪费时间),可以在循环里先检查目标文件是否存在,只处理还没生成缩放版本的原视频:
Get-ChildItem -Filter *.mp4 -Recurse | % { $scaledPath = "$($_.FullName)_scaled.mp4" if (-not (Test-Path $scaledPath)) { ffmpeg -i $_.FullName -vf "scale='if(gt(ih,iw),360,-2)':'if(gt(iw,ih),360,-2)'" $scaledPath && Remove-Item $_.FullName } }
这样既避免了覆盖提示,还能节省重复处理的时间,一举两得。
为什么你之前的方法没用?
echo y |在PowerShell里的管道行为和CMD不同,而且ffmpeg的交互提示不一定会从标准输入读取确认信息,所以这个方法无效。Remove-Item -Force只是用来跳过删除文件时的确认提示,但你的问题出在ffmpeg生成文件的阶段,所以这个参数对ffmpeg的覆盖提示完全不起作用。
备注:内容来源于stack exchange,提问作者cudnn_account
相关产品推荐
相关产品推荐

