PowerShell调用ffmpeg提示Z盘文件No such file or directory
问题根因
Z盘为云服务挂载的虚拟驱动器,手动执行ffmpeg报错No such file or directory的核心原因有两点:
- 从资源管理器地址栏复制的云盘路径,大概率夹带不可见的零宽Unicode控制字符,肉眼识别路径完全准确,但实际传入命令行的字符序列和文件系统记录的真实路径不匹配
- PowerShell向ffmpeg这类原生Win32程序传递参数时,手动输入的带空格、特殊字符的云盘路径不会自动做底层路径规范化;而
Get-ChildItem返回的FullName属性是.NET运行时直接从文件系统读取的原生规范路径,无字符污染、格式偏差,因此遍历脚本执行正常。本地物理盘(如C盘)路径复制时不会夹带隐藏控制字符,因此移动文件后手动执行可成功。
注意:你之前尝试的路径加/去引号、加
r/file:r前缀、替换双反斜杠的方案均无效,原因是r前缀属于Python原生字符串转义语法,PowerShell不识别该标记,双反斜杠也不符合PowerShell的路径解析规则,这类修改反而会让路径偏差更大。
手动执行单条命令的解决方案
不要直接粘贴资源管理器复制的原始路径,按以下任一方式处理即可正常识别:
- 路径规范化转换:先在PowerShell中执行以下命令,把复制的原始路径传入,输出的结果就是可直接使用的无隐藏字符的原生路径:
复制命令输出的路径替换原命令中的路径参数,即可正常执行。(Get-Item "这里粘贴你从资源管理器复制的Z盘原始路径").FullName - 变量传参法:用变量承接规范化后的路径再传入ffmpeg,避免参数解析时的格式偏差,示例:
$inFile = (Get-Item "Z:\带空格&特殊字符的原视频.mp4").FullName $outFile = [io.path]::ChangeExtension($inFile, '_compressed.mp4') ffmpeg -i $inFile -y -vcodec libx264 -acodec ac3 -threads 1 $outFile - 原生路径标记法:手动写路径时用单引号包裹,路径前加
\\?\前缀强制Win32子系统走原生路径识别规则,忽略路径中的特殊字符解析偏差,示例:ffmpeg -i '\\?\Z:\我的视频 测试版&最终版.mp4' -y -vcodec libx264 -acodec ac3 '\\?\Z:\输出视频_.mp4'
批量处理脚本优化
你当前使用的遍历脚本可正常运行,补充两点优化规避特殊场景报错:
- 传入ffmpeg参数前加
--%停止解析标记,避免文件名中带$、&、@等PowerShell特殊字符时被错误转义 - 遍历后跳过云盘未离线缓存的重解析点占位文件,避免ffmpeg读取未下载到本地的云端文件报错
优化后完整脚本:
$oldvids = Get-ChildItem -Path Z:\ -Include *.mp4,*.mov,*.wmv,*.avi -Recurse -File foreach ($oldvid in $oldvids) { # 跳过未下载到本地的云盘占位文件 if ($oldvid.Attributes -band [IO.FileAttributes]::ReparsePoint) { continue } $newvid = [io.path]::ChangeExtension($oldvid.FullName, '_.mp4') ffmpeg --% -i $oldvid.FullName -y -vcodec libx264 -acodec ac3 -threads 1 $newvid }
内容的提问来源于stack exchange,提问作者wildcat89
相关产品推荐
相关产品推荐

