Ошибка при попытке запустить скрипт powershell из приложения WinForms - PullRequest
2 голосов
/ 28 июня 2019

Итак, я следовал инструкциям, сделанным онлайн, которые демонстрируют, как запустить скрипт powershell из приложения Windows Form с помощью VB.Net.Однако я продолжаю сталкиваться с этой проблемой, которую я не могу на всю жизнь найти ответ или что-нибудь близкое, чтобы привести меня к ответу.

    Dim myRunSpace As Runspace = RunspaceFactory.CreateRunspace
    myRunSpace.Open()
    Dim mypipeline As Pipeline = myRunSpace.CreatePipeline()
    Dim command As String = " .'C:\Program Files\Microsoft\Exchange Server\V14\bin\RemoteExchange.ps1'; Connect-ExchangeServer -auto; get-mailbox -recipienttypedetails UserMailbox | select-object DisplayName,RecipientTypeDetails,PrimarySmtpAddress"
    mypipeline.Commands.AddScript(command)
    mypipeline.Commands.Add("Out-String")
    Dim outputs As Collection(Of PSObject) = mypipeline.Invoke()
    'myRunSpace.Close()
    Dim MyStringBuiler As New StringBuilder()
    For Each result As PSObject In outputs
        MyStringBuiler.AppendLine(result.ToString())
    Next
    MessageBox.Show(MyStringBuiler.ToString)
    '        ReadExchangeCSVFile()

Это мой код, и он близко следует тому, что делает пример,Тем не менее, я получаю эту ошибку:

{"Cannot load Windows PowerShell snap-in Microsoft.PowerShell.Diagnostics  because of the following error: Could not load file or assembly 'Microsoft.PowerShell.Commands' or one of its dependencies.The system cannot find the file specified."}Source : System.Management.Automation

Из исследований, которые я до сих пор собирал, это может не соответствовать версиям библиотек, которые я импортирую, и версии powershell, установленной на машине.

Строка с ошибками является первой в приведенном выше фрагменте кода.Поэтому при создании пространства выполнения он показывает ошибку при отладке.

1 Ответ

0 голосов
/ 02 июля 2019

Точно.Если это работает в пустом проекте формы Windows без большого количества ссылок, это означает, что у вас есть конфликт (и тогда счастливое межпроцессное взаимодействие!).

Если это не сработает, это означает, что вам повезло, и вам просто нужно найти, какая DLL отсутствует (вы можете посмотреть в программе просмотра журнала Fusion или показать окно сообщения в соответствующем обработчике событий):

Imports System
Imports System.Linq
Imports System.Reflection
Imports Microsoft.VisualBasic

Module StartUp

    Public Sub Main(args As String())
        AddHandler AppDomain.CurrentDomain.AssemblyResolve, AddressOf CustomResolver
        'Load powershell here

    End Sub

    Private Function CustomResolver(sender As Object, args As ResolveEventArgs) As Assembly
        MsgBox($"Assembly {args.Name} not found!{vbCrLf}{vbCrLf}(referred by {args.RequestingAssembly?.Modules?.FirstOrDefault()?.FullyQualifiedName})")
        Return Nothing
    End Function

End Module
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...