Поэтому я следовал онлайн-руководству, в котором показано, как запустить сценарий powershell из приложения формы Windows с помощью 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, установленной на машине.
Строка с ошибкой является первой в приведенном выше фрагменте кода. Поэтому при создании пространства выполнения он показывает мне ошибку при отладке.
@Christoph, поэтому я создаю пустой проект формы Windows и пытаюсь загрузить оттуда powershell? или что именно ты имеешь в виду





Точно. Если он работает в пустом проекте формы 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
Только что запустил это, и это дало мне другую ошибку: {"Произошла ошибка при попытке загрузить системные оснастки Windows PowerShell. Пожалуйста, свяжитесь со службой поддержки клиентов Microsoft."} - так что моя проблема заключается в отсутствии dll? и мне нужно найти, чего не хватает.
поэтому я знаю, какие из них мне нужны, но не знаю, как их установить/добавить в проект или на компьютер.
Давно у меня были эти проблемы, и я пытался отодвинуть их в сторону. В конце концов, я запускаю основное приложение, команды powershell, связанные с обменом, команды, связанные с активным каталогом, и команды, связанные с файловым сервером, в 4 разных процессах на 3 разных машинах. Командлеты Exchange мешают командам Active Directory (мы использовали команды Quest, теперь Dell). Exchange использует удаленные командлеты, которые вызывают проблемы, и они любят работать только на x64. Мне пришлось загружать их вручную, а некоторые сборки смешанные нативные/CLI (IJW), которые нужно загружать через правильную перегрузку (работает только 1)...
Когда я нахожу время, я смотрю, как я это сделал тогда, но у меня нет кода, хранящегося на этой машине (а ему около 10 лет). Не зная, отсутствует ли DLL или в чем проблема, попробуйте выполнить каждую команду, хранящуюся в вашем RemoteExchange.ps1, как собственную команду, и посмотрите, где возникает ошибка.
Из дальнейших исследований я понял, что две ненайденные сборки — это System.Management.Automation.resources, а также Microsoft.PowerShell.Commands.Diagnostics. Я пытаюсь запустить его в Windows 2012 AD R2 с установленным на нем Powershell 1.0, некоторые люди говорят мне, что проблема в том, что эти сборки не установлены в этой версии, я не могу перейти на powershell 3.0, который представил Runspaces. Спасибо за постоянную поддержку, это много значит.
Powershell 1.0 - это, вероятно, только название папки, это была бы древняя версия, которая наверняка не поддерживала бы текущие командлеты Exchange. См. $PSVersionTable. Я не понимаю вашего утверждения «Я не могу перейти на powershell 3.0, в котором представлены Runspaces». Вы явно зависите от пространства выполнения в коде выше.
Да, проблема заключалась в том, что мой код использовал пространства выполнения, которые используются в powershell версии 3.0 и выше. У меня была установлена версия 1.0, поэтому я обновился до версии 3.0, и теперь код работает.
Это точно могут быть несовместимые версии, это можно узнать если создать пустой проект и потом загрузить powershell. Если это работает, то у вас есть ссылки, которые не подходят друг к другу в компонентах COM. Например, командлеты Exchange, использующие тот же объект AD com, но в другой версии.