WPF中C#调用PowerShell脚本Visual Studio无正确输出问题
问题原因
- 你直接对
resultsN这个Collection<PSObject>集合调用Debug.WriteLine,默认只会输出集合的类型全名,不会自动遍历输出集合内的每个结果对象 - 没有捕获PowerShell执行过程中的错误流输出,就算脚本执行报错也无法看到相关提示
- 额外注意:你脚本里写的IP段是
198.168.1.1/24,大概率是写错了常用私网段192.168.1.1/24,也可能导致nmap无预期输出
修复代码
首先确保你项目已经正确引用System.Management.Automation程序集,然后修改Button_Click方法如下:
private void Button_Click(object sender, RoutedEventArgs e) { Debug.WriteLine("I am Here!"); // 用using自动释放PowerShell对象资源 using (PowerShell ps = PowerShell.Create()) { ps.AddScript(@"C:\Research\Network Scanner\powerscript.ps1"); Collection<PSObject> resultsN = ps.Invoke(); // 遍历输出所有执行结果 foreach (var result in resultsN) { Debug.WriteLine(result.ToString()); } // 输出执行过程中的错误信息,方便排查问题 if (ps.Streams.Error.Count > 0) { Debug.WriteLine("===== PowerShell执行错误 ====="); foreach (var error in ps.Streams.Error) { Debug.WriteLine(error.ToString()); } } } }
额外注意事项
- 确认nmap已经加入系统环境变量,或者在PowerShell脚本里写nmap的完整绝对路径,避免PowerShell找不到nmap程序
- nmap的
-O参数需要管理员权限才能正常执行操作系统探测,建议右键以管理员身份运行Visual Studio再调试程序 - nmap扫描属于耗时操作,直接在UI线程执行会导致WPF窗体卡死,建议后续把PowerShell执行逻辑放到异步任务中运行
内容的提问来源于stack exchange,提问作者a_polo
相关产品推荐
相关产品推荐

