You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 16:48:44