在C#中的Powershell命令#
答
伴随基思的做法的线
using System;
using System.Management.Automation;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
var script = @"
Get-WmiObject -list -namespace root\cimv2 | Foreach {$_.Name}
";
var powerShell = PowerShell.Create();
powerShell.AddScript(script);
foreach (var className in powerShell.Invoke())
{
Console.WriteLine(className);
}
}
}
}
答
我不知道你为什么提到PowerShell;你可以在纯C#和WMI(即System.Management
命名空间)中执行此操作。
要获得所有WMI类的列表,使用SELECT * FROM Meta_Class
查询:
using System.Management;
...
try
{
EnumerationOptions options = new EnumerationOptions();
options.ReturnImmediately = true;
options.Rewindable = false;
ManagementObjectSearcher searcher =
new ManagementObjectSearcher("root\\cimv2", "SELECT * FROM Meta_Class", options);
ManagementObjectCollection classes = searcher.Get();
foreach (ManagementClass cls in classes)
{
Console.WriteLine(cls.ClassPath.ClassName);
}
}
catch (ManagementException exception)
{
Console.WriteLine(exception.Message);
}
答
你可能会希望只使用System.Management命名空间像海伦回答,但你也可以在主机的PowerShell的应用。见http://www.codeproject.com/KB/cs/HowToRunPowerShell.aspx
答
就我个人而言,我会用海伦的方法,并取消对PowerShell的依赖。这就是说,这里是你将如何在C#代码此使用PowerShell来获取所需的信息:
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Management.Automation;
namespace RunspaceInvokeExp
{
class Program
{
static void Main()
{
using (var invoker = new RunspaceInvoke())
{
string command = @"Get-WmiObject -list -namespace root\cimv2" +
" | Foreach {$_.Name}";
Collection<PSObject> results = invoker.Invoke(command);
var classNames = results.Select(ps => (string)ps.BaseObject);
foreach (var name in classNames)
{
Console.WriteLine(name);
}
}
}
}
}
答
只是要注意,可用的工具允许您创建,运行和保存用PowerShell编写的WMI脚本,PowerShell Scriptomatic工具可从Microsoft TechNet网站下载。
使用此工具,您可以探索root \ CIMV2或任何其他WMI名称空间内的所有WMI类。
这很好用。谢谢您的帮助。 – Sanch01R 2009-12-21 11:09:17