#c# #powershell #hyper-v
#c# #powershell #hyper-v
Вопрос:
Я пытаюсь вызвать сценарий PowerShell из C #, который обычно очень прост, за исключением того, что по какой-то причине команды в модуле FailoverClusters никогда не могут быть найдены при вызове из C # (не в области видимости). Вот что я обнаружил:
Команды всегда находятся при использовании интерактивного сеанса PowerShell:
PS C:> Get-Cluster -Name DummyCluster
Name
----
DummyCluster
Команды никогда не обнаруживаются при использовании локального сеанса PowerShell из C#:
var ps = PowerShell.Create();
ps.AddCommand("Get-Cluster");
ps.AddParameter("Name", "DummyCluster");
var r = ps.Invoke();
//Exception: command not found
Я перепробовал около 6-7 различных способов импорта модуля, и ни один из них не сработал. Вот один из них, взятый из этого руководства по теме:
var ps = PowerShell.Create();
var ss = InitialSessionState.CreateDefault();
var modules = new string[1]{"FailoverClusters"};
ss.ImportPSModule(modules);
var rs = RunspaceFactory.CreateRunspace(ss);
rs.Open();
var iv = new RunspaceInvoke(rs);
var r = iv.Invoke("Get-Cluster -Name DummyCluster");
//Exception: command not found
Интересно, что команды обнаруживаются при использовании удаленного сеанса PowerShell. Это правдоподобный обходной путь для определенных вариантов использования.
var ci = new WSManConnectionInfo(); //localhost remote connection
var rs = RunspaceFactory.CreateRunspace(ci);
rs.Open();
var iv = new RunspaceInvoke(rs);
var r = iv.Invoke("Get-Cluster -Name DummyCluster");
//Exception: access is denied
Модуль FailoverClusters не виден из C#:
var ps = PowerShell.Create();
ps.AddCommand("Get-Module");
ps.AddParameter("ListAvailable");
ps.AddArgument("FailoverClusters");
var results = ps.Invoke();
Console.WriteLine(results.Count.ToString()); //prints 0
Однако он виден из интерактивного сеанса PowerShell:
PS C:> Get-Module -ListAvailable FailoverClusters
Directory: C:windowssystem32WindowsPowerShellv1.0Modules
ModuleType Version Name ExportedCommands
---------- ------- ---- ----------------
Manifest 2.0.0.0 FailoverClusters {Add-ClusterCheckpoint, Add-ClusterDisk, Add-ClusterFileSe...
Ответ №1:
Модуль FailoverClusters доступен только в 64-разрядных сеансах PowerShell. Убедитесь, что C # DLL, которую вы создаете, является 64-разрядной DLL.
Комментарии:
1. Спасибо!! Эта небольшая информация стала переломным моментом, после почти 2 дней ударов головой о стену…