【问题标题】:Call to powershell process from inlined C#从内联 C# 调用 powershell 进程
【发布时间】:2019-05-13 09:22:57
【问题描述】:

我有一个 PowerShell 脚本,它执行一些像这样的内联 C# 代码:

Add-Type -ReferencedAssemblies $Assem -TypeDefinition $Source -Language CSharp
[AnalyzeHelper.AnalyzeDirectories]::CheckPath("XXX")

在那个 C# 代码中,我想输出到我的 PowerShell 输出。 所以在我的 C# 中我已经实现了:

public static void CheckPath(string path)
{
    WriteOutput("Begin CheckPath");
}

private static void WriteOutput(string text)
{
  using (PowerShell powerShellInstance = PowerShell.Create())
  {
    powerShellInstance.AddCommand("Write-Host").AddParameter("string", text).Invoke();
  }
}

但不幸的是,它不起作用。它实际上只是挂在调用调用中。

【问题讨论】:

  • 为什么不直接将字符串作为 C# 代码的结果返回并使用 powershell 本身输出?
  • 该示例非常简化,因为我在 C# 部分中有更多逻辑,并且希望从那里输出几个日志语句。所以它不仅仅是一个字符串,而是几个。
  • 不应该是powerShellInstance.AddCommand("Write-Host").AddParameter(text).Invoke();吗?
  • 刚试了下,还是不行。但我发现我可以改为委托样式,这是我的目的的解决方案。

标签: c# powershell tfs continuous-integration vnext


【解决方案1】:

事实证明,PowerShell 支持委托,因此解决方案非常简单。 我是这样打电话的:

[Action[string]]$action = {param($message) Write-Host "$message"}
Add-Type -ReferencedAssemblies $Assem -TypeDefinition $Source -Language CSharp
[AnalyzeStringLibraries.AnalyzeStrings]::CheckPath("XXX", $action)

然后在 C# 中我可以这样做:

public static void CheckPath(string path, Action<string> writeToHost)
{
    writeToHost("Begin CheckPath");
}

【讨论】:

  • 不错;请注意,PowerShell 将脚本块 ({ ... }) 视为按需方法调用中的委托,因此您甚至可以直接调用 [AnalyzeStringLibraries.AnalyzeStrings]::CheckPath("XXX", { param($message) Write-Host "$message" })
  • 感谢您告诉我。凭借我的 C# 开发背景,我一直对 PowerShell 的强大功能感到惊讶。
猜你喜欢
  • 2013-08-19
  • 2012-10-26
  • 1970-01-01
  • 2010-11-07
  • 1970-01-01
  • 1970-01-01
  • 2013-06-08
  • 2022-11-11
  • 1970-01-01
相关资源
最近更新 更多