【问题标题】:Powershell remote no standard outputPowershell远程无标准输出
【发布时间】:2015-02-03 00:28:21
【问题描述】:

我在 C# 中使用 PowerShell 对象来执行远程命令。我要获取值的示例命令是Get-ExecutionPolicy,但没有返回标准输出。

最终目标是获取远程实例上的剩余磁盘空间。

这是我用来远程执行脚本的代码。它工作正常,按预期安静地执行所有测试,输出错误和异常,但是......没有标准输出。有人可以帮忙吗?

PowerShell ps = PowerShell.Create();
logger.LogAndDisplay(Logger.MessageType.Note, "Connecting to '" + instance0 + "'");
logger.LogAndDisplay(Logger.MessageType.Note, "Executing script on remote: '" + path0 + "'.");
ps.AddScript("$password = convertto-securestring -asplaintext -force -string " + pass);
ps.AddScript("$credential = new-object -typename system.management.automation.pscredential -argumentlist " + user + ", $password");
ps.AddScript("$session = new-pssession " + instance0 + " -credential $credential");
ps.AddScript("Invoke-Command -Session $session -FilePath " + path0);
ps.AddScript("Remove-PSSession $session");
Execute(ps);

private bool Execute(PowerShell ps0)
{
    bool success = true;

    PSOutput.Clear();
    PSOutput = ps0.Invoke();

    if (ps0.HadErrors)
    {
        success = false;
        PSDataCollection<ErrorRecord> PSErrors = ps0.Streams.Error;
        foreach (ErrorRecord e in PSErrors)
        {
            logger.LogAndDisplay(Logger.MessageType.Note, e.ToString());
        }
    }

    if (PSOutput.Count() > 0)
    {
        logger.LogAndDisplay(Logger.MessageType.Subheader, "Command output:");
    }

    foreach (PSObject outputItem in PSOutput)
    {
        if (outputItem != null)
        {
            logger.LogAndDisplay(Logger.MessageType.Note, outputItem.BaseObject.GetType().FullName);
            logger.LogAndDisplay(Logger.MessageType.Note, outputItem.BaseObject.ToString() + "\n");
        }
    }

    logger.LogAndDisplay(Logger.MessageType.Note, "Command complete. Disconnecting.");
    ps0.Dispose();
    return success;
}

【问题讨论】:

  • 您从哪里获得 powershell 代码中的 $session 变量?为什么要从 powershell 使用 Invoke-Command 而不是使用远程运行空间?我不经常使用运行空间,所以我不只是在口头上问。
  • @briantist - $session 在前几行中设置了密码和用户名...它工作正常,我肯定会连接到远程实例并在远程实例上执行。我从来没有使用过运行空间,我现在会做一些研究。但是目前很多项目都是用PS来远程的,所以最好是围绕PS的解决方案。

标签: c# powershell remote-access


【解决方案1】:

问题出在这一行:

ps.AddScript("Remove-PSSession $session");

Remove-PSSession cmdlet 关闭 Windows PowerShell 会话 (PSSessions) 在当前会话中。它停止任何命令 在 PSSessions 中运行,结束 PSSession,并释放 PSSession 正在使用的资源。 如果 PSSession 已连接 到远程计算机,Remove-PSSession 也会关闭连接 在本地和远程计算机之间。

(强调我的)

显然,这包括流。

我在搜索过程中偶然发现了 ths interesting 关于 PowerShell 输出的帖子,它也可以回答一些未来的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-21
    • 1970-01-01
    • 2012-05-26
    • 1970-01-01
    相关资源
    最近更新 更多