【问题标题】:Different result when running PowerShell script with C#使用 C# 运行 PowerShell 脚本时的不同结果
【发布时间】:2018-05-03 09:28:02
【问题描述】:

我正在使用 C# 执行 PowerShell 脚本:

using (PowerShell powerShellInstance = PowerShell.Create())
{
    string query = string.Format(@"$server = ""{0}""
        $db = ""master""
        $sql = ""SELECT DISTINCT hostprocess FROM master.dbo.sysprocesses""
        $user = ""{1}""
        $pass = ""{2}""
        $processId = Invoke-sqlcmd -Server $server -Database $db -Username $user -Password $pass -Query $sql | select -ExpandProperty hostprocess
        Write-Output $processId", Server, DbUserName, DbPass);
    powerShellInstance.AddScript(query);
    var results = powerShellInstance.Invoke();
}

当我在 PowerShell 控制台中运行脚本时,它返回 2 个字符串值。但在 C# 中,results 有 2 个元素,但它们为空。这里有什么问题,为什么通过 C# 执行时行为不同?

【问题讨论】:

  • 我已经尝试修复格式 - 您可能想检查我没有更改含义;如果你想进一步调整,点击“编辑”
  • 请不要在收到您想要的答案后删除问题。这剥夺了未来的读者可以学习的潜在好材料,并阻止现有的回答者因他们提供的帮助而获得荣誉。

标签: c# powershell


【解决方案1】:

PowerShell.Invoke 只为执行的 PowerShell 命令的返回值返回 PSObject 对象。当您使用Write-Output 写入主机时,将没有返回值,因此您无法在results 集合中看到结果。而是将写入的输出写入PowerShell 对象的Information stream

using (var ps = PowerShell.Create())
{
    // commands that writes to the output
    ps.AddScript("Write-Host 'output value'");
    ps.Invoke();

    var output = (ps.Streams.Information.First().MessageData as HostInformationMessage).Message;
    Console.WriteLine(output); // output value
}

using (var ps = PowerShell.Create())
{
    // command that returns a value, e.g. a string literal
    ps.AddScript("'return value'");
    var results = ps.Invoke();

    string stringResult = results.First().BaseObject as string;
    Console.WriteLine(stringResult); // return value
}

在 PowerShell 控制台本身内,您当然会直接看到书面输出,并且通常也会直接显示未收集的返回值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-02
    • 2017-07-06
    • 2015-11-23
    • 2013-07-08
    • 2015-10-14
    • 2021-10-13
    • 1970-01-01
    相关资源
    最近更新 更多