如何从C#中以编程方式调用CmdLet时捕获PowershellCmdLet的详细输出后台参考源代码评论更新于2009-07-20这是基于以下答案的源代码。有些事情我仍然不清楚:*如何调用“Get-Colors”cmdlet(理想情况下不必将其作为字符串传递给ps对象)*如何获取构建的详细输出而不是将它们收集在结束。使用系统;使用System.Management.Automation;namespaceDemoCmdLet1{classProgram{staticvoidMain(string[]args){varps=System.Management.Automation.PowerShell.Create();ps.Commands.AddScript("$verbosepreference='continue';write-verbose42");foreach(variinps.Invoke()){Console.WriteLine("正常输出:{0}",i);}foreach(variinps.Streams.Verbose){Console.WriteLine("详细输出:{0}",i);}}}[Cmdlet("Get","Colors")]publicclassGetColorsCommand:Cmdlet{protectedoverridevoidProcessRecord(){this.WriteObject("Red");this.WriteVerbose("r");this.WriteObject("绿色");this.WriteVerbose("g");this.WriteObject("蓝色");this.WriteVerbose("b");上面的代码产生了这个输出:d:DemoCmdLet1DemoCmdLet1>binDebugDemoCmdLet1.exe详细输出:42更新于2010年1月16日通过使用Powershell类(在System.Management.Automation中找到,但仅随powershell2.0SDK程序集一起提供版本,而不是Windows7上的现成版本),我可以以编程方式调用cmdlet并获得详细的输出。剩下的部分是实际向该PowerShell实例添加一个自定义cmdlet-因为这是我最初的目标-以单元测试我的cmdlet而不是PowerShell附带的cmdlet。类程序{staticvoidMain(string[]args){varps=System.Management.Automation.PowerShell.Create();ps.AddCommand("获取进程");ps.AddParameter("详细");ps.Streams.Verbose.DataAdded+=Verbose_DataAdded;foreach(PSObject结果在ps.Invoke()中){Console.WriteLine(“输出:{0,-24}{1}”,result.Members[“ProcessName”].Value,result.Members[“Id”]。价值);}控制台.ReadKey();}staticvoidVerbose_DataAdded(objectsender,DataAddedEventArgse){Console.WriteLine("verboseoutput:{0}",e.Index);}}[Cmdlet("Get","Colors")]publicclassGetColorsCommand:Cmdlet{protectedoverridevoidProcessRecord(){this.WriteObject("Hello");this.WriteVerbose("世界");powershell脚本中的示例:ps>$ps=[powershell]::create()ps>$ps.Commands.AddScript("`$verbosepreference='continue';write-verbose42")ps>$ps.invoke()ps>$ps.streams.verboseMessageInvocationInfoPipelineIterationInfo----------------------------------------42系统stem.Management.Automation.Invocat...{0,0}这应该很容易转换为C#1。stringscriptFile="Test.ps1";2.使用(PowerShellps=PowerShell.Create())3.{4.conststringgetverbose="$verbosepreference='continue'";5.附言。AddScript(string.Format(getverbose));6.附言。调用();7.附言。命令。清除();8.ps.AddScript(@"."+脚本文件);9.ps.Invoke();10.foreach(varvinps.Streams.Verbose)11.{12.Console.WriteLine(v.Message);13.}14.重要的行是第5行和第6行。这基本上为会话和即将到来的新命令和脚本设置了$verbosepreference。以上是C#学习教程:HowtocapturethedetailedoutputofPowershellCmdLetwhencallingCmdLetprogrammaticallyfromC#。如果对大家有用,需要进一步了解C#学习教程,希望大家多加关注——本文来自网络收藏不代表立场,如涉及侵权,请点右转联系管理员删除。如需转载请注明出处:
