Go通过os/exec调用PowerShell运行.NET代码无输出报错问题咨询
问题原因
你的代码跑不通是几个低级错误叠加导致的:
Add-Type参数使用错误:-AssemblyName参数仅用于加载系统已注册的程序集,传入内嵌C#代码必须用-TypeDefinition参数,之前的传参方式PowerShell根本无法识别你写的C#代码。- PowerShell传参逻辑错误:
-Command参数后只接受一段完整的脚本字符串,你把脚本内容拆成了多个独立的命令行参数,PowerShell会把后续参数当成启动配置项,不会作为命令执行。 - C#代码语法错误:C#不允许直接定义游离的静态方法,你写的
GetAllConnectedCameras方法没有放在公开静态类中,编译阶段就会失败。 - 错误捕获缺失:你之前把
CombinedOutput()返回的error直接丢弃,根本看不到PowerShell抛出的编译、执行错误,只能拿到空值或者乱码。
可直接运行的实现代码
package main import ( "fmt" "os/exec" ) func main() { // 所有PowerShell逻辑整合为单个完整脚本字符串 psScript := ` # 加载需要的系统程序集 Add-Type -AssemblyName System.Management # 内嵌C#代码,用here-string包裹避免转义问题 Add-Type -TypeDefinition @' using System.Collections.Generic; using System.Management; public static class CameraTool { public static List<string> GetConnectedCameras() { List<string> cameraList = new List<string>(); using (ManagementObjectSearcher searcher = new ManagementObjectSearcher("SELECT * FROM Win32_PnPEntity WHERE PNPClass = 'Image' OR PNPClass = 'Camera'")) { foreach (ManagementObject dev in searcher.Get()) { cameraList.Add(dev["Caption"].ToString()); } } return cameraList; } } '@ # 调用C#方法输出结果 [CameraTool]::GetConnectedCameras() ` // 加-NoProfile、-ExecutionPolicy Bypass避免本机配置、执行策略干扰 cmd := exec.Command("powershell.exe", "-NoProfile", "-ExecutionPolicy", "Bypass", "-Command", psScript) output, err := cmd.CombinedOutput() if err != nil { fmt.Printf("执行失败: %v\n错误信息: %s\n", err, string(output)) return } fmt.Println("已连接摄像头列表:") fmt.Print(string(output)) }
关键说明
- 用PowerShell的
@'...'@here-string语法包裹C#代码,不需要额外转义内部的双引号,从根源上避免转义符导致的脚本错误。 - 不要拆分
-Command后的脚本内容,所有要执行的PowerShell逻辑必须拼成单个字符串传入,否则参数解析会完全混乱。 - C#代码必须定义公开静态类包裹工具方法,否则Add-Type编译会直接失败。
- 不要丢弃exec调用返回的error对象,执行出错时直接打印捕获到的输出内容,可以快速定位是脚本语法错还是权限问题。
内容的提问来源于stack exchange,提问作者Daniel D'champs
相关产品推荐
相关产品推荐

