【发布时间】:2014-11-15 19:09:54
【问题描述】:
我正在尝试使用 C# 在运行空间中执行带有参数的 Powershell 文件。不幸的是,我得到以下输出:
提示用户失败的命令,因为主机程序或 命令类型不支持用户交互。尝试主机程序 支持用户交互,例如 Windows PowerShell 控制台 或 Windows PowerShell ISE,并从 不支持用户交互的命令类型,例如 Windows PowerShell 工作流程。
我能做什么?
当前的 c# 代码。这需要执行将在 PS 文件中的命令,并且需要返回一个 json 字符串。
public string ExecuteCommandDirect(int psId, string psMaster, string psFile)
{
String FullPsFilePath = @"C:\CloudPS\" + psFile + ".ps1";
String PsParameters = FullPsFilePath + " -psId " + psId + " -psMaster " + psMaster + " -NonInteractive";
// Create Powershell Runspace
Runspace runspace = RunspaceFactory.CreateRunspace();
runspace.Open();
// Create pipeline and add commands
Pipeline pipeline = runspace.CreatePipeline();
pipeline.Commands.AddScript(PsParameters);
// Execute Script
Collection<PSObject> results = new Collection<PSObject>();
try
{
results = pipeline.Invoke();
}
catch (Exception ex)
{
results.Add(new PSObject((object)ex.Message));
}
// Close runspace
runspace.Close();
//Script results to string
StringBuilder stringBuilder = new StringBuilder();
foreach (PSObject obj in results)
{
Debug.WriteLine(obj);
stringBuilder.AppendLine(obj.ToString());
}
return stringBuilder.ToString();
}
PS 代码:
param([int]$psId = 0, [string]$psMaster = 'localhost');
$date = Get-Date -Format 'h:m:s' | ConvertTo-Json;
Write-Host $date;
exit;
【问题讨论】:
-
你能贴出你正在使用的代码吗?
-
嗨,我已经添加了代码。
-
尝试删除
Write-Host,只留下$date。exit也不需要。 -
如果您想使用需要主机的 cmdlet,您需要创建一个运行空间并传递一个 PSHost 实例。像 Write-Host 或 Read-Host 这样的 Cmdlet 实际上要求您还实现从 PSHost 实例上的属性返回的 PSHostUserInterface。 AFAIK 这些抽象类没有默认的公共实现。您必须自己编写它们,但是there are some examples available on MSDN.
-
有关如何实现它们的示例(或仅使用 ps1 -> exe 包装器)请参阅此博客文章 - rkeithhill.wordpress.com/2010/09/21/make-ps1exewrapper
标签: c# powershell runspace