1

我必须从 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班级。

4

1 回答 1

-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。哪种方法,为什么?

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

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

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

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

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

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

在此处输入图像描述

于 2012-05-20T00:58:52.283 回答