如何基于子文件夹*.mp4文件触发独立进程的PowerShell脚本
优化后的PowerShell实现方案
你的原始代码存在几个问题:如果一个子文件夹里有多个MP4文件,会重复启动多次脚本;相对路径调用脚本容易找不到文件;没有验证脚本是否存在。下面是针对需求的最优实现:
# 定位到Cut文件夹 $rootPath = "$env:USERPROFILE\Desktop\Cut" # 获取Cut下所有包含MP4文件的直接子文件夹(Model 01、Model 02这类),自动去重 $targetFolders = Get-ChildItem -Path $rootPath -Directory | Where-Object { # 检查当前文件夹下是否存在MP4文件 Test-Path -Path (Join-Path $_.FullName "*.mp4") } # 遍历每个符合条件的文件夹 foreach ($folder in $targetFolders) { $scriptFullPath = Join-Path $folder.FullName "ffmpeg.ps1" # 先确认脚本存在,避免启动无效进程 if (Test-Path -Path $scriptFullPath -PathType Leaf) { # 以独立PowerShell进程启动脚本,同时指定工作目录为目标子文件夹 Start-Process -FilePath powershell.exe ` -ArgumentList "-File `"$scriptFullPath`"" ` -WorkingDirectory $folder.FullName } }
关键优化点说明:
- 精准筛选文件夹:只遍历Cut下的直接子文件夹(通过
-Directory参数),并通过Test-Path判断是否存在MP4文件,避免重复触发同一个文件夹的脚本 - 绝对路径调用脚本:用
Join-Path拼接脚本的完整路径,彻底解决相对路径找不到文件的问题,同时兼容带空格的文件夹/文件名 - 验证脚本存在性:启动前先检查
ffmpeg.ps1是否存在,避免无意义的进程启动 - 指定工作目录:通过
-WorkingDirectory确保脚本运行时的当前目录是目标子文件夹,适配脚本中依赖当前目录的操作(比如读取同文件夹内的文件)
如果需要递归处理Cut下所有层级的子文件夹(不仅仅是直接子文件夹),只需给Get-ChildItem加上-Recurse参数即可:
$targetFolders = Get-ChildItem -Path $rootPath -Directory -Recurse | Where-Object { Test-Path -Path (Join-Path $_.FullName "*.mp4") }
内容的提问来源于stack exchange,提问作者Tyrone Hirt
相关产品推荐
相关产品推荐

