我在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;
}
答案 0 :(得分:1)
问题在于这一行:
ps.AddScript("Remove-PSSession $session");
Remove-PSSession cmdlet可关闭Windows PowerShell会话 (PSSessions)在本届会议上。它会停止任何命令 在PSSessions中运行,结束PSSession,释放 PSSession正在使用的资源。如果PSSession已连接 对于远程计算机,Remove-PSSession也会关闭连接 本地和远程计算机之间。
(强调我的)
显然,这包括流。
在我的搜索过程中,我偶然发现了ths interesting关于PowerShell输出的帖子,这些帖子也可以回答未来的一些问题。