Добавить команды Powershell в конвейер - PullRequest
2 голосов
/ 27 марта 2012

Я пытаюсь получить нижнее хранилище от сервера Exchange 2010, и функция будет работать в контейнере WCF.

Проблема, с которой я сталкиваюсь, заключается в том, что я не могу запустить несколько команд PowerShell в конвейере.

Я пробовал следующее (основываясь на этом, , как вызвать команду powershell с конвейером «format-list» и «out-file» из c #? ):

string strCommand = @"Get-MailboxDatabase -Status | select ServerName,Name,DatabaseSize | Sort-Object DatabaseSize";
string CommandLine = string.Format("&{{{0}}}", strCommand);
pipeLine.Commands.AddScript(CommandLine);

Но я получаю:

Необработанное исключение: System.Management.Automation.RemoteException: литералы блока скрипта недопустимы в режиме ограниченного языка или разделе данных.

Тоже попробовал,

Command getMailbox = new Command("Get-MailboxDatabase");
getMailbox.Parameters.Add("Status", null);

Command sort = new Command("Sort-Object");

pipeLine.Commands.Add(getMailbox);
pipeLine.Commands.Add(sort);

Collection<PSObject> commandResults = pipeLine.Invoke();

Но не удача:

Необработанное исключение: System.Management.Automation.RemoteException: термин «объект сортировки» не распознается как имя командлета

Интересно, должен ли я использовать несколько конвейеров (по одному конвейеру на командлет), но я не уверен.

Ответы [ 2 ]

3 голосов
/ 28 марта 2012

Учитывая, что Sort-Object - это команда, которая не распознается схемой с именем 'http://schemas.microsoft.com/powershell/Microsoft.Exchange", тогда я приступаю к разработке функции с использованием Snap-Ins, и она работает нормально.

Примечание Iберу первую базу данных, потому что режим сортировки по умолчанию возрастает.Также я хотел бы прокомментировать, что если вы скомпилируете в Framework 4.0, вы получите «сообщение об ошибке« Значение не может быть пустым »», поэтому вам нужно изменить на 3.5.

Имейте в виду, что это происходитиспользуется службой WCF, поэтому нет проблем с оснастками.Если вы хотите использовать его в любом другом приложении, например в консольном приложении, вам следует установить EMS 2010 на этот компьютер.

Эта функция в основном выполняет следующую команду PowerShell, Get-MailboxDatabase -Status|Размер базы данных объекта сортировки

    private static string getLowServerStoreDN_SnapIn(string ExchangeSite)
    {
        string strResult = string.Empty;
        RunspaceConfiguration rsConfig = RunspaceConfiguration.Create();
        PSSnapInException snapInException = null;
        PSSnapInInfo info = rsConfig.AddPSSnapIn("Microsoft.Exchange.Management.PowerShell.E2010", out snapInException);
        Runspace runspace = RunspaceFactory.CreateRunspace(rsConfig);

        try
        {
            runspace.Open();
            Command getMailbox = new Command("Get-MailboxDatabase");
            getMailbox.Parameters.Add(new CommandParameter("Status", null));
            Command sort = new Command("Sort-Object");
            sort.Parameters.Add("Property", "DatabaseSize");

            Pipeline commandPipeLine = runspace.CreatePipeline();
            commandPipeLine.Commands.Add(getMailbox);
            commandPipeLine.Commands.Add(sort);

            Collection<PSObject> getmailboxResults = commandPipeLine.Invoke();

            if (getmailboxResults.Count > 0)
            {
                PSObject getMailboxResult = getmailboxResults[0];
                strResult = getMailboxResult.Properties["Name"].Value.ToString();
                //foreach (PSObject getMailboxResult in getmailboxResults)
                //{
                //    strResult = getMailboxResult.Properties["Name"].Value.ToString();
                //}
            }
        }
        catch (ApplicationException e)
        {
            //Console.WriteLine(e.Message);
            throw new FaultException("function getLowServerStoreDN_SnapIn(" + ExchangeSite + "): " + e.Message,
                FaultCode.CreateReceiverFaultCode("BadExchangeServer", "http://example.com"));
        }
        return strResult;
    }
3 голосов
/ 27 марта 2012

Похоже, проблема в пространстве выполнения. Если это сервер Exchange, и вы выполняете его в сеансе удаленного управления, предоставляемом Exchange, единственное, что вы можете сделать в этом сеансе, - это запустить командлеты Exchange. Командлеты Select-Object и Sort-Object и другие элементы языка PowerShell просто недоступны для использования.

...