PowerShell脚本适配任意连接设备:如何通过Target实现?
实现PowerShell脚本在设备连接时自动生效的方案
是的,可以通过Windows任务计划程序(Task Scheduler)设置触发条件,让脚本在设备连接时自动执行。下面分两步解决问题:
第一步:修正现有脚本的问题
你的原始脚本存在两处关键错误,需要先修复才能正常工作:
- WMI查询使用
AND逻辑,导致无法匹配任何设备(一个设备不可能同时包含多个不同名称),需改为OR; - 用于设置默认设备的
Marshal.WriteByte代码无效(写入空指针会引发错误),需替换为正确的设备设置逻辑。
修正后的脚本示例:
# 定义设置默认摄像头的函数 function Set-DefaultCamera { param([string]$cameraName) $camera = Get-PnpDevice -FriendlyName "*$cameraName*" -Class Camera | Where-Object { $_.Status -eq 'OK' } if ($camera) { # 提取设备GUID $guid = $camera.InstanceId.Split('\')[-1] # 修改注册表设置默认捕获设备 Set-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows Media Foundation\Platform" -Name "DefaultCaptureDevice" -Value $guid Write-Host "默认摄像头已设置为: $cameraName" } } # 定义设置默认音频设备的函数 function Set-DefaultAudioDevice { param([string]$deviceName, [string]$deviceType) # deviceType可选值: Playback(扬声器)/Recording(麦克风) $deviceEnumerator = New-Object -ComObject MMDeviceEnumerator $activeDevices = $deviceEnumerator.EnumerateAudioEndpoints($deviceType, 1) # 1代表仅激活设备 foreach ($device in $activeDevices) { if ($device.FriendlyName -like "*$deviceName*") { $device.SetDefault($deviceType) Write-Host "默认$deviceType设备已设置为: $deviceName" break } } } # 获取目标设备列表 $devices = Get-WmiObject -Query "SELECT * FROM Win32_PnPEntity WHERE (Name LIKE '%Logitech BRIO%' OR Name LIKE '%Phnx MT107a%')" | Where-Object { $_.Status -eq 'OK' } # 遍历设备并设置默认值 foreach ($device in $devices) { $deviceName = $device.Name if ($deviceName -like '*Logitech BRIO*') { Set-DefaultCamera -cameraName 'Logitech BRIO' } elseif ($deviceName -like '*Phnx MT107a*') { Set-DefaultAudioDevice -deviceName 'Phnx MT107a' -deviceType 'Recording' Set-DefaultAudioDevice -deviceName 'Phnx MT107a' -deviceType 'Playback' } }
第二步:通过任务计划程序设置触发条件
使用任务计划程序创建一个基于设备连接事件的任务,自动运行脚本:
- 打开任务计划程序(运行
taskschd.msc); - 创建新任务:
- 常规选项卡:命名任务(如"设备连接时设置默认设备"),勾选"使用最高权限运行"(修改注册表和音频设置需要管理员权限);
- 触发器选项卡:点击"新建",选择"事件"触发类型:
- 日志选择
Microsoft-Windows-PnPManager/Admin; - 源选择
PnPManager; - 事件ID输入
2003(该ID对应设备成功连接并识别的事件); - 若需仅针对特定设备触发,可点击"编辑筛选器"→"XML"标签,添加设备名称过滤(示例:
*[EventData[Data[@Name='FriendlyName'] and Data='Logitech BRIO']]);
- 日志选择
- 操作选项卡:点击"新建",选择"启动程序":
- 程序/脚本输入
powershell.exe; - 添加参数:
-ExecutionPolicy Bypass -File "C:\你的脚本路径\SetDefaultDevices.ps1"(替换为实际脚本路径);
- 程序/脚本输入
- 设置选项卡:勾选"错过计划启动时间后尽快运行任务",可根据需要调整任务超时时间;
- 保存任务,之后设备连接时脚本会自动执行。
内容的提问来源于stack exchange,提问作者Vova Gorelnikov
相关产品推荐
相关产品推荐

