我正在尝试学习如何将PowerShell集成到我正在开发的WPF / C#GUI中。我希望用户能够单击一个按钮,执行PowerShell脚本,然后返回信息并将其将输出写入richtextbox
。
这是PowerShell:
Function Get-MappedPrinters {
[Cmdletbinding()]
Param(
[alias('dnsHostName')]
[Parameter(ValueFromPipelineByPropertyName=$true,ValueFromPipeline=$true)]
[string]$ComputerName = $Env:COMPUTERNAME
)
$id = Get-WmiObject -Class win32_computersystem -ComputerName $ComputerName |
Select-Object -ExpandProperty Username |
ForEach-Object { ([System.Security.Principal.NTAccount]$_).Translate([System.Security.Principal.SecurityIdentifier]).Value }
$path = "Registry::\HKEY_USERS\$id\Printers\Connections\"
Invoke-Command -Computername $ComputerName -ScriptBlock {param($path)(Get-Childitem $path | Select PSChildName)} -ArgumentList $path | Select -Property * -ExcludeProperty PSComputerName, RunspaceId, PSShowComputerName
}
这是C#
private void SystemTypeButton_Click(object sender, RoutedEventArgs e)
{
using (PowerShell ps = PowerShell.Create())
{
ps.AddScript(File.ReadAllText(@"..\..\Scripts\systemtype.ps1"), true).AddParameter("ComputerName", ComputerNameTextBox.Text).AddCommand("Out-String");
var results = ps.Invoke();
MainRichTextBox.AppendText(results.ToString());
}
}
但是,它仅返回对象,而不返回其属性。
"System.Collections.ObjectModel.Collection1[System.Management.Automation.PSObject]"
。有没有办法遍历对象?
最佳答案
您可以像其他数组一样使用foreach
循环遍历对象。
另外,建议通过添加try catch块来处理异常,通过使用ps.Streams.Error
获取错误缓冲区来处理powershell错误也可能会有所帮助。
using (PowerShell ps = PowerShell.Create())
{
ps.AddScript(File.ReadAllText(@"..\..\Scripts\systemtype.ps1"), true).AddParameter("ComputerName", ComputerNameTextBox.Text).AddCommand("Out-String");
Try
{
System.Collections.ObjectModel.Collection<PSObject> results = ps.Invoke();
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
foreach (var test in results)
MainRichTextBox.AppendText(test.ToString());
}
相关问题:
Get Powershell errors from c#
How to read PowerShell exit code via c#
C# Powershell Pipeline foreach-object
关于c# - 通过C#执行PowerShell函数脚本,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61855464/