Как запустить несколько команд в одном блоке скриптов в PowerShell с помощью C #? - PullRequest
1 голос
/ 30 октября 2019

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

 using (powershell = PowerShell.Create())
 {
    command = new PSCommand();
    command.AddCommand("Invoke-Command");
    command.AddParameter("ScriptBlock",
          System.Management.Automation.ScriptBlock.Create(
           "New-MailContact -Name '" + txtEmail.Text + "' -ExternalEmailAddress '" + txtEmail.Text + "';" ));
     command.AddParameter("ScriptBlock",
           System.Management.Automation.ScriptBlock.Create(
           "Set-MailContact -Identity '" + txtEmail.Text + "'-HiddenFromAddressListsEnabled $true"));


    command.AddParameter("Session", session);
    powershell.Commands = command;
    powershell.Runspace = runspace;
    result = powershell.Invoke();
    if (powershell.Streams.Error.Count > 0 || result.Count != 1)
    {
         if (powershell.Streams.Error[0].ToString().ToLowerInvariant().Contains("already exists"))
         {
               return;
          }
          else
          {
               throw new Exception("Fail to establish the connection");
           }
       }
      }

Невозможно связать параметр, так как параметр ScriptBlock указан более одного раза. Чтобы предоставить несколько значений параметрам, которые могут принимать несколько значений, используйте синтаксис массива. Например, «-параметр value1, value2, value3».

Я также пробовал

command.AddParameter("ScriptBlock",
   System.Management.Automation.ScriptBlock.Create(
   "New-MailContact -Name '" + txtEmail.Text + "' -ExternalEmailAddress '" + txtEmail.Text + "';" +  " Set-MailContact -Identity '" + txtEmail.Text + "'-HiddenFromAddressListsEnabled $true"));

и

command.AddParameter("ScriptBlock",
   System.Management.Automation.ScriptBlock.Create(
   "(New-MailContact -Name '" + txtEmail.Text + "' -ExternalEmailAddress '" + txtEmail.Text + "')" +  " Set-MailContact -Identity '" + txtEmail.Text + "'-HiddenFromAddressListsEnabled $true"));

1 Ответ

0 голосов
/ 31 октября 2019

Я думаю, вы можете немного упростить свой код - вам не нужны элементы Invoke-Command и ScriptBlock, чтобы просто вызывать по одной команде - вы можете вместо этого вызывать командлеты напрямую.

Вы также можете решить проблему внедрения скрипта, поднятую @madreflection в то же время, если вы создаете свои команды с параметрами.

Вот версия в PowerShell (мне было проще протестировать, чем раскрутить образец C #). проект :-)), который вы можете преобразовать в C #:

$p = [System.Management.Automation.PowerShell]::Create()

$c = new-object System.Management.Automation.Runspaces.Command("New-MailContact");
$c.Parameters.Add("Name", $name)
$c.Parameters.Add("ExternalEmailAddress", $address)
$null = $p.Commands.AddCommand($c)

$c = new-object System.Management.Automation.Runspaces.Command("Set-MailContact");
$c.Parameters.Add("Identity", $identity)
$c.Parameters.Add("HiddenFromAddressListsEnabled", $hidden)
$null = $p.Commands.AddCommand($c)

$p.Invoke()

Обновление - ах, только что заметил, что вы используете параметр Session в Invoke-Command - если выесли вы выполняете его с удаленным доступом, то вам, вероятно, do нужно Invoke-Command в конце концов. Возможно, этот ответ поможет ...

Установка параметров в ScriptBlock при выполнении команд Powershell с C #

...