【问题标题】:Load Powershell module via .NET code通过 .NET 代码加载 Powershell 模块
【发布时间】:2012-05-22 01:09:15
【问题描述】:

我必须从 VB.NET 程序中调用 PS 命令。如果我正在调用标准 PS 命令,这可以正常工作,但如果我必须调用位于 3rd 方模块中的命令,我似乎无法使其工作。在 PS 控制台上,我可以输入Import-Module MyModule,然后我可以调用该模块中的命令。我尝试了以下方法,但它不起作用,我仍然无法从模块内访问我的命令:

Dim PowerShell As Management.Automation.PowerShell = PowerShell.Create()
Dim PowerShellCommand As New PSCommand()
Dim PowerShellCommandResults As Object

PowerShellCommand.AddScript("Import-Module MyModule")
PowerShellCommand.AddScript("Get-MyCommand | Out-String")
PowerShell.Commands = PowerShellCommand
PowerShellCommandResults = PowerShell.Invoke()

如何使用上面的代码示例做到这一点?除非必须,否则我不想将所有内容都更改为 Runspace 类。

【问题讨论】:

  • 该答案使用 Runspace 类。我已经知道我可以使用那个类来做到这一点,我的目标是不用那个类来做到这一点。
  • 您是否收到错误消息? PowerShellCommandResults有结果吗?
  • 没有错误(如果有我会发布它们)并且 PowerShellCommandResults 不包含任何内容。但是,如果我再次调用标准系统命令,则 PowerShellCommandResults 包含一个 ps 对象数组。显然对 import-module 的调用不起作用。但它确实可以在命令行中工作,或者如果我在代码中使用 Runspace 类。

标签: vb.net powershell


【解决方案1】:

简单的代码如下所示,它确实有效:

Dim command As New PSCommand()
command.AddScript("<Powershell command here>")
Dim powershell As Management.Automation.PowerShell = powershell.Create()
powershell.Commands = command
Dim results = powershell.Invoke()

我已经在其他线程中解释了以下内容,您可以选择一个: Powershell via VB.NET. Which method and why?

如果您提供有关错误信息的更多信息,我可能会提供帮助。

通过完整示例添加了更多信息:

我刚刚创建了一个非常简单的 C# DLL,并从 VB.NET 中调用它,如下所示:

C# DLL 代码:(将其视为第三方模块)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Xml.Linq;

namespace CSVtoXML
{
  public class Actions
  {
    public Actions()
    {

    }

    public static string writeHello(string name)
    {
        return "Hello " + name;

    }
 }
}

如果您想在 PS 命令窗口中测试此第 3 方 DLL,只需使用以下命令:

PS C:\2012>  [Reflection.Assembly]::LoadFile("C:\2012\CSVtoXML.dll")

GAC    Version        Location
---    -------        --------
False  v2.0.50727     C:\2012\CSVtoXML.dll


PS C:\2012> [CSVtoXML.Actions]::writeHello("Avkash")
 Hello Avkash
PS C:\2012>

现在我通过在 VB.NET 应用程序中加载第 3 方模块使用相同的步骤,如下所示:

Module Module1
 Sub Main()
    Dim PowerShell As Management.Automation.PowerShell = PowerShell.Create()
    Dim PowerShellCommand As New PSCommand
    PowerShellCommand.AddScript("[Reflection.Assembly]::LoadFile('C:\2012\CSVtoXML.dll')")
    PowerShellCommand.AddScript("[CSVtoXML.Actions]::writeHello('Avkash')")
    PowerShell.Commands = PowerShellCommand
    Dim results = PowerShell.Invoke()
    MsgBox(results.Item(0).ToString())
 End Sub
End Module

这是调试窗口中的输出,以证明代码确实按预期工作:

【讨论】:

  • 我确实阅读了您的问题并建议上面的代码可以工作。除非你告诉我什么不起作用,否则我无能为力。您需要告诉我用错误消息解释问题以进一步挖掘,只是说它“不起作用”并没有帮助.. 感谢 -ve。下一个
  • 我的问题清楚地解释了我需要通过 FIRST 调用 import-module 来调用第 3 方模块中的函数。我给出的示例不起作用,似乎是因为对 import-module 的调用不起作用。向我展示如何加载 dll 并通过命名空间和类名调用函数并不是我想要的。
  • 感谢您的解释。欣赏它。我会花一些时间看看为什么 Import-module 不能与 VB.net 一起使用,并告诉你..
  • 要明确...如果我在代码中使用 Runspace 类,import-module 可以正常工作。出于教育原因,我不想使用 Runspace 类,我想了解为什么上面的原始代码不起作用。我怀疑这与调用之前调用 add-script 两次有关,但如果我执行 add-script 调用,add-script 调用,那也不起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-24
  • 2017-09-22
  • 1970-01-01
  • 2016-02-29
  • 2011-03-27
  • 1970-01-01
  • 2018-11-25
相关资源
最近更新 更多