c# - 如何在 C# 中显示 cmd 的多行输出
问题描述
我需要我的 c# 程序运行 cmd 查询以显示所有 sql 服务,然后将它们显示在消息框中。在我将要运行它的情况下,经常会有不止一个,而且每次的名称可能都不同。
“Wmic service where (PathName like '%Binn\sqlservr%') get caption, name”显示我需要的信息,但返回多行。WriteNote() 方法是将信息写入程序中的文本框的方法。
我已经尝试了所有可以在 Google 上找到的东西,但似乎没有任何效果。
private void DoListSQLServices()
{
System.Diagnostics.Process process = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();
//startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
startInfo.FileName = "cmd.exe";
startInfo.Arguments = "Wmic service where (PathName like '%Binn\\sqlservr%') get caption, name";
process.StartInfo = startInfo;
startInfo.RedirectStandardOutput = true;
startInfo.UseShellExecute = false;
process.Start();
string output = process.StandardOutput.ReadToEnd();
this.WriteNote(output);
process.WaitForExit();
}
当我运行这段代码时,我得到了这个:
Microsoft Windows [版本 6.1.7601] 版权所有 (c) 2009 Microsoft Corporation。版权所有。
{项目文件位置}\bin\Debug>
并且在调试文件夹中放置了一个 pbd 文件。
我想要的是它显示 SQL 服务的标题和名称,就像您通过 cmd 手动运行该命令一样。最终,用户将键入其中一个以让程序重新启动它们,但我宁愿让程序显示列表,也不愿让用户转到 Windows 中的服务并手动搜索它们。
提前致谢!
解决方案
正如 Noodles 在评论中提到的,最好通过 .NET 中的 WMI 支持来做到这一点。一种相当直接的方法是使用ManagementObjectSearcher
该类来ObjectQuery
针对 WMI 数据执行。
创建一个新的控制台应用程序。将程序集的引用添加到文件顶部System.Management
并添加using System.Management;
到program.cs
文件顶部。
现在添加以下代码:
static void Main()
{
// Create a scope (connection to WMI)
var scope = new ManagementScope(@"\\localhost\root\cimv2");
// Create query
var query = new ObjectQuery(@"SELECT Name,Caption FROM Win32_Service WHERE PathName like '%Binn\\sqlserv%'");
// Create a search to run the query against the scope
using (var search = new ManagementObjectSearcher(scope, query))
{
// Iterate through the query results
foreach (var item in search.Get())
{
// get values, all strings in this case
string name = (string)item["Name"];
string caption = (string)item["Caption"];
Console.WriteLine("{0}\t{1}", name, caption);
}
}
}
请注意,ObjectQuery
查询语法与 WMIC 语法略有不同。它被称为 WQL(WMI 查询语言),并且在很大程度上以 SQL 为模型。
希望您可以轻松地调整以上内容以供您自己使用。请注意您要获取的字段的实际类型。 这是Win32_Service 对象的属性列表。
推荐阅读
- database - 在Stata中没有标识符的情况下将数据从长整形到宽
- php - BINANCE FUTURES 的 php websocket 不起作用
- javascript - Leaflet / LayersControl / 移动设备上的自定义按钮
- unreal-engine4 - 我在与对象交互时连续降低健康,但只有在你触摸对象时才会降低
- javascript - discordjs/语音不播放音频
- substrate - 带有 polkadot-launch 的本地 [Polkadot + Statemine] 测试网
- gdb - GDB mi 解释器返回空 -symbol-info-functions
- activemq-artemis - Apache ActiveMQ Artemis 日志记录解释
- python - 优先队列缓存问题(Java/Python)
- java - 使用自定义 setter 或自定义注解修改 POJO 类字段(在 Spring Boot 中)