如何解决在C#和Powershell中运行Powershell的行为有所不同
该图显示了在C#和Powershell ISE中执行的同一powershell命令。我的问题是,Powershell显示了进程和进程目录的完整列表,但是在C#中执行的代码结果不包含svchost.exe之类的Windows进程。
当然,我的C#表单和Powershell ISE都以管理员身份运行。 另外,我确保对表单进行编码以使用管理特权启动。 可以肯定的是,我通过右键单击执行了C#-以管理员身份运行(我对Powershell ISE所做的操作)
命令:Powershell和C#
get-process | get-item -erroraction silentlycontinue | format-table name,directory
get-process | format-table name,directory
尽管此特定命令显示了所有过程:
get-process
不幸的是,将其与以上语法结合使用将显示来自C#的不同输出。
private string RunScript(string script)
{
Runspace runspace = RunspaceFactory.CreateRunspace();
runspace.Open();
Pipeline pipeline = runspace.CreatePipeline();
pipeline.Commands.AddScript(script);
pipeline.Commands.Add("Out-String");
Collection<PSObject> results = pipeline.Invoke();
runspace.Close();
StringBuilder stringBuilder = new StringBuilder();
foreach (PSObject pSObject in results)
stringBuilder.AppendLine(pSObject.ToString());
return stringBuilder.ToString();
}
private void button1_Click(object sender,EventArgs e)
{
output.Clear();
output.Text = RunFilePs1(input.Text);
}
解决方法
由于某些原因,在32位模式下运行时,Get-Process不会返回某些进程(可能是64位)的Path,因此将它们传递给Get-Item找不到任何内容。
您可以通过从x86 PS ISE运行PS脚本来看到这一点。
因此,如果将C#窗体切换为64位,它将返回所有进程。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。