繁体   English   中英

在 C# 和 Powershell 中运行 Powershell 的行为不同

[英]Running Powershell in C# and Powershell is behaving differently

该图显示了在 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# 不同的 output。

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);
}

出于某种原因,Get-Process 在 32 位模式下运行时不会返回某些进程(可能是 64 位的)的路径,因此将这些传递给 Get-Item 无法找到任何东西。

您可以通过从 x86 PS ISE 运行 PS 脚本来查看这一点。

在此处输入图像描述

因此,如果您将 C# 表单切换到 64 位,它将返回所有进程。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM