在C#中调用powershell的cmdlets是非常有用的方法,随着powershell的不断流行,微软针对powershell也会不断推出各个应用的管理模块,最流行的就是Exchage的管理模块,通过powershell的管理模块能完成所有的管理任务。如果在C#中直接调用这些管理模块的命令,那么就避免了深入了解各个应用的APIs接口,直接调用需要的命令就可以了,C#就可以完成前端的界面优化等其他工作。
如何在C#中调用Powershell的cmdlet命令微软也没有个官方文档。只能放狗四处乱搜,还好总算找到一点文档,看着自己研究研究。
以在C#中调用Get-Process为例,在Powershell控制台中输入Get-Process会出现列表结果
PS C:\Users\sunjt1.LENOVO> Get-Process
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
63 8 2604 4536 71 3792 ApMsgFwd
80 9 2760 4888 71 0.02 4212 ApntEx
141 13 3976 8796 85 3.78 2224 Apoint
75 8 1220 3392 42 1772 armsvc
154 12 17208 16648 55 584 audiodg
140 21 26824 30736 155 10.20 1928 chrome
615 41 72672 74448 260 34.26 2940 chrome
154 20 67188 31092 182 0.09 7016 chrome
32 4 1080 2356 22 1552 conhost
48 7 2232 4888 61 0.02 4228 conhost
57 7 5084 7532 65 2.32 7336 conhost
179 17 20856 14504 184 0.11 8212 ConsoleApplication1.vshost
667 14 2564 4540 65 448 csrss
1179 45 8652 76588 250 580 csrss
1318 104 250116 239948 767 328.37 3520 devenv
224 35 88532 81492 225 1,527.56 1864 dwm
271 11 6016 9788 108 0.34 2180 Energy Management
280 22 9484 12724 99 1852 EvtEng
1396 108 99180 88492 407 126.17 1312 explorer
854 75 83536 28916 443 86.94 2144 Fetion
130 14 2744 7320 94 0.09 7308 FlashUtil32_11_2_202_235_ActiveX
131 13 5296 10364 100 10.58 5392 FlashUtil64_11_2_202_235_ActiveX
129 13 6556 9616 139 0.05 2100 hkcmd
在C#中调用,结果输出比较头疼,不过如果不是给用户看的话,问题不大,可以根据输出的结果集合进行操作。临近下班,自己看不解释
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Management.Automation;
using System.Management.Automation.Runspaces;
namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
Runspace runspace = RunspaceFactory.CreateRunspace();
runspace.Open();
Pipeline pipeline = runspace.CreatePipeline();
Command getProcess = new Command("get-process");
pipeline.Commands.Add(getProcess);
Collection<PSObject> output = pipeline.Invoke();
runspace.Close();
Console.WriteLine(output.Count);
Console.ReadKey();
}
}
}
调用get-process产生的集合存储在output集合里面,使用foreach调用每个集合对象,每个对象的属性集合,使用[“”]属性名称来调用,值用Value来输出。
命令参数的添加,还没测试
getProcess.Parameters.Add("Module", "");
getProcess.Parameters.Add("processname", "qq");