我想在PowerShell中运行命令时完全捕获所得到的输出。
例如,当我输入LS时,我得到:
但是,当我使用此代码时:
Runspace runspace = RunspaceFactory.CreateRunspace();
runspace.Open();
PowerShell ps = PowerShell.Create(); // Create a new PowerShell instance
ps.Runspace = runspace; // Add the instance to the runspace
ps.Commands.AddScript("ls"); // Add a script
Collection<PSObject> results = ps.Invoke();
runspace.Close();
StringBuilder stringBuilder = new StringBuilder();
foreach (PSObject obj in results)
{
Console.WriteLine(obj.ToString());
}
我得到以下输出:
Microsoft.Management.Infrastructure.dll
System.Management.Automation.dll
System.Management.Automation.xml
WpfApp1.exe
WpfApp1.exe.config
WpfApp1.pdb
尽管此输出可能会派上用场,但在其他应用程序中,我没有得到正确的输出作为回报,因此,我希望使用在PowerShell本身中看到的确切输出。
在PowerShell中,一行一行一行地读取输出信息?
您可以通过访问Properties
的PSObject
来读取值。
foreach (PSObject obj in results)
{
var name = obj.Properties["Name"]?.Value.ToString()
var mode = obj.Properties["Mode"]?.Value.ToString();
var length = obj.Properties["Length"]?.Value.ToString();
var lastMod = (DateTime?)obj.Properties["LastWriteTime"]?.Value;
Console.WriteLine(string.Format("{0} {1} {2} {3}", mode, lastMod, length, name));
}
如果您想获得Powershell产生的确切文本,则可以在powershell命令中使用Out-String
:
Out-String
ps.Commands.AddScript("ls | Out-String");
注:此答案还建议ls | ConvertTo-Json -Compress
的哪个部分以更集中的方式显示并带有补充信息。
修改您的脚本以通过管道传递到haldo's helpful answercmdlet,它使用PowerShell的格式系统将其呈现为字符串,就像将其输出到控制台一样。
Out-String
一些助手:
出于鲁棒性,我建议避免在脚本和已编译的代码中使用别名(例如Out-String
的ps.AddScript("ls | Out-String"); // Add a script
)。在当前情况下,ls
在类Unix平台上不起作用,因为未在其中定义别名,以免与平台本机Get-ChildItem
实用程序发生冲突。
最好将ls
包裹在ls
块中,以确保处理掉PowerShell实例:PowerShell ps = PowerShell.Create();
通常不需要显式创建一个运行空间-using
将为您创建一个运行空间。
using (PowerShell ps = PowerShell.Create()) { ... }
返回的PowerShell.Create()
实例直接公开诸如System.Management.Automation.PowerShell
的方法-无需使用System.Management.Automation.PowerShell
属性。