2015-10-25 5 views
1

В настоящее время я пытаюсь использовать C# для вызова Get-SMBShare, который может быть использован в Powershell ... однако, бросает эту ошибку:Calling Get-Smbshare в C#

Исключение: Caught: «Термин" Get-SMBShare 'не распознается как имя командлета, функции, файла сценария или исполняемой программы. Проверьте правильность написания имени или укажите путь к нему, убедитесь, что путь верен и повторите попытку ". (System.Management.Automation.CommandNotFoundException) A System.Management.Automation.CommandNotFoundException был пойман: «Термин« Get-SMBShare »не распознается как имя командлета, функции, файла сценария или исполняемой программы. написание имени или включение пути, проверьте правильность пути и повторите попытку ». Время: 25/10/2015 19:17:59 Тема: Pipeline Выполнение резьбы [6028]

Мой первый язык PowerShell, так что я пытаюсь перевести инструмент с графическим интерфейсом из PowerShell в C#, и инструмент использует сотни команд PS - есть ли что-то, что я должен назвать? Я тестирую вещи на консоли здесь.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Collections.ObjectModel; 
using System.Management.Automation; 
using System.Management.Automation.Runspaces; 
using System.Threading.Tasks; 

namespace ConsoleApplication2 
{ 
    class Program 
    { 
     private static void GetShareNames() 
     { 
      // Call the PowerShell.Create() method to create an 
      // empty pipeline. 
      PowerShell ps = PowerShell.Create(); 

      ps.AddCommand("Get-SmbShare"); 

      Console.WriteLine("Name     Path"); 
      Console.WriteLine("----------------------------"); 

      // Call the PowerShell.Invoke() method to run the 
      // commands of the pipeline. 
      foreach (PSObject result in ps.Invoke()) 
      { 
       Console.WriteLine(
         "{0,-24}{1}", 
         result.Members["Name"].Value, 
         result.Members["Path"].Value); 
      } // End foreach. 
      Console.ReadLine(); 
     } // End Main. 
     static void Main(string[] args) 
     { 
      GetShareNames(); 
     } 
    } 
} 

ответ

3

Необходимо сначала импортировать модуль. Палка в этой линии, прежде чем пытаться выполнить Get-SmbShare команду:

ps.AddCommand("Import-Module").AddArgument("SmbShare"); 
ps.Invoke(); 
ps.Commands.Clear(); 

ps.AddCommand("Get-SmbShare"); 

Другой способ заключается в инициализации пространство выполнения с модулем SmbShare предварительно загруженным, например:

InitialSessionState initial = InitialSessionState.CreateDefault(); 
initial.ImportPSModule(new[] {"SmbShare"}); 
Runspace runspace = RunspaceFactory.CreateRunspace(initial); 
runspace.Open();  
PowerShell ps = PowerShell.Create(); 
ps.Runspace = runspace; 
+0

Привет Кит, я посмотрел на это и это не сработает. Не могли бы вы убедиться, что это работает для вас? –

+0

Я проверил первый пример, и он работает после исправления одного - ошибка с костяной головой (не смешивайте в arg с именем команды) и два - исправление более тонкой проблемы. AFAICT Модуль SmbShare работает только в 64-битном режиме, поэтому, если ваш проект C# настроен «предпочитает 32-разрядный», вам нужно снять этот флажок. –

+0

Спасибо за это - это мой первый проект C#, поэтому я ценю помощь! –