PowerShell脚本如何模拟在其他目录下调用外部命令
PowerShell指定转码命令工作目录实现自动输出到目标文件夹
other-transcode 没有自定义输出路径参数,所有输出文件都会写到进程启动时的工作目录,要在脚本里复现手动cd到输出目录再执行命令的效果,有两种可靠实现方式,和手动操作的执行逻辑完全一致。
方法1:单进程指定工作目录(推荐)
用Start-Process单独给转码进程指定工作目录,不会修改脚本本身的当前路径,不会干扰后续其他路径操作,是最稳妥的方案。
示例脚本:
# 按需修改这两个路径 $inputDir = "D:\your_video_folder\input" $outputDir = "D:\your_video_folder\output" # 输出目录不存在则自动创建 if (!(Test-Path $outputDir)) { New-Item -ItemType Directory -Path $outputDir | Out-Null } # 遍历输入目录下所有mp4文件,要支持其他格式自行修改Filter参数 Get-ChildItem -Path $inputDir -Filter *.mp4 -File | ForEach-Object { Write-Host "当前转码文件:$($_.Name)" # 核心参数:-WorkingDirectory 指定转码进程的工作目录为输出文件夹 # -Wait 等待当前文件转码完成再处理下一个,避免多进程抢占资源 # -NoNewWindow 转码日志直接打印在当前窗口,方便查看进度 Start-Process other-transcode -ArgumentList "`"$($_.FullName)`"" -WorkingDirectory $outputDir -Wait -NoNewWindow }
参数说明:
-WorkingDirectory $outputDir完全等价于手动打开shell后cd到输出目录的操作,转码进程的工作路径会被精准设置为目标输出文件夹,生成的文件直接存在这里- 传入输入文件时用全路径,不需要手动计算相对路径,不会出现找不到输入文件的问题
方法2:临时切换脚本工作目录
如果脚本逻辑简单,也可以临时把脚本的当前路径切到输出目录,执行完所有转码后再切回原路径,记得加finally块保证异常时也能恢复路径:
$originalPath = Get-Location $inputDir = "D:\your_video_folder\input" $outputDir = "D:\your_video_folder\output" if (!(Test-Path $outputDir)) { New-Item -ItemType Directory -Path $outputDir | Out-Null } try { Set-Location $outputDir Get-ChildItem -Path $inputDir -Filter *.mp4 -File | ForEach-Object { Write-Host "当前转码文件:$($_.Name)" other-transcode $_.FullName } } finally { # 无论转码成功、报错中断,最后都会切回脚本启动时的原路径 Set-Location $originalPath }
注意点
- 两种方案的最终效果和手动操作完全一致,输出文件名和输入文件对应,直接落在指定的输出目录,不需要转码完成后再移动文件
- 如果需要匹配mov、mkv等其他视频格式,可以把
Get-ChildItem的Filter参数改成对应扩展名,或者用-Include *.mp4,*.mov,*.mkv匹配多格式 - 路径包含空格时,脚本里给路径加双引号的写法已经做了兼容,不需要额外处理
内容的提问来源于stack exchange,提问作者DarkDiamond
相关产品推荐
相关产品推荐

