2013-09-24 2 views
1

У меня есть две строки команды power-shell в коде ниже. Команда 1 включает почтовый ящик, а команда 2 отключает активную синхронизацию.Команда C# и powershell multiple

PSCommand psCmd = new PSCommand(); 

command2 ="Enable-Mailbox -Identity \""+ ExchangeIdentity 
    +"\" -Database \""+ExchangeDBName+ "\" -DomainController \"" 
    +ExchangeDC+"\" -primarysmtpaddress \""+ExchangePrimarySMTPAddress +"\""; 

command1 = "Set-CASMailbox -Identity \"" +ExchangePrimarySMTPAddress 
    +"\" -ActiveSyncEnabled "+ActiveSync_Status; 

allcommand = command2 + " |" + command1; 

runspace.Open(); 

powershell.AddScript(allcommand); 

powershell.Runspace = runspace; 
ICollection<PSObject> iobj = powershell.Invoke(); 

Когда я пытаюсь запустить команду 1 только в сценарии добавления, почтовый ящик создается успешно. Когда я совмещаю его со вторым, создается только один почтовый ящик, но активная синхронизация не отключается (если я передаю значение как значение false).

Как я могу обрабатывать две команды в одной строке?

ответ

1

Для версии 2.0

создать C# код для вызова силовой оболочки и выполнить 1-ую команду для создания почтового ящика высыпьте и написать другой набор C# код для вызова и выполнить команду Active Sync и отчуждать.

Примечание: контроллер домена должен быть одинаковым для создания почтового ящика и активной синхронизации.

+0

Вы можете использовать AddStatement() для запуска команд в один вызов. См. Ответ @ JasonShirks ниже. –

1

Не работает ли это, если вы AddScript (command2) и AddScript (command1) в конвейер, а затем вызывают их?

Это должно заставить PowerShell запустить обе команды в последовательности друг за другом ...

+0

жаль, что я попробовал с "|" и ";" и для "|" сценарий не был выполнен и для ";" я создал почтовый ящик, но активная команда синхронизации не работала. – GPR

+1

Я имел в виду, что вы не должны объединять обе команды в одну, а затем передавать ее в powershell, вместо этого попробуйте добавить BOTH-скрипты отдельно в powershell с помощью AddScript и затем вызвать их. Вы попробовали это? – MichaC

0

Согласно документации по команде Enable-Mailbox, он не выводит ничего. Забудьте о трубе. Измените его на ';' для разделения этих двух утверждений.

+0

Для ';' Я получил первую команду, а второй - не – GPR

3

Я бы рекомендовал не использовать AddScript, если вы просто вызываете команды.

Предполагая, что вы хотите вызвать обе команды, но не трубные результаты от первого ко второму, и если вы используете PowerShell V3, я хотел бы написать код вроде этого:

powershell.AddCommand("Enable-Mailbox") 
    .AddParameter("Identity", ExchangeIdentity) 
    .AddParameter("Database", ExchangeDBName) 
    .AddParameter("DomainController", ExchangeDC) 
    .AddParameter("PrimarySmtpAddress ", ExchangePrimarySMTPAddress); 
// AddStatement - like adding a ';' in a script - V3 only 
powershell.AddStatement(); 
powershell.AddCommand("Set-CASMailbox") 
    .AddParameter("Identity", ExchangePrimarySMTPAddress) 
    .AddParameter("ActiveSyncEnabled", ActiveSync_Status); 

Написано так (не используя AddScript), вы избегаете одной из возможных проблем со вставкой скрипта. Если какой-либо из аргументов может исходить от злонамеренного пользователя, можно было бы построить аргумент, который закрывает одну из предыдущих кавычек, а затем добавляет вредоносный скрипт, и вы запустите этот скрипт с правами администратора. Используя AddCommand/AddParameter, вы можете избежать этой ситуации.

Даже если вы полностью контролируете аргументы, вы можете столкнуться с проблемами с некоторыми аргументами, если они содержат символы типа ';' и вы неправильно цитировали аргументы.

+0

+1 Это должен быть принятый ответ. AddStatement() позволяет «выгружать» несколько команд и вызывать вызов только один раз. –