Вызов двух команд одновременно powershell

Я хотел бы одновременно вызывать две команды при вводе параметров, поэтому, например, если бы я должен был выполнить этот код, я бы поставил:

abcdef folder1 folder2

и это сделало бы две папки на рабочем столе.

Приведенный ниже код является просто примером, но я хочу знать правильный синтаксис для этого.

function abcdef {
  param($folder1, $folder2)
  $s = $ExecutionContext.InvokeCommand.NewScriptBlock("mkdir C:\'Documents and Settings'\X\Desktop\$folder1")
  $s1 = $ExecutionContext.InvokeCommand.NewScriptBlock("mkdir C:\'Documents and Settings'\X\Desktop\$folder2")
  Invoke-Command -ComputerName $ComputerRemote -ScriptBlock $s,$s1 -Credential $cred 
}

person Jendizer    schedule 22.10.2014    source источник


Ответы (2)


function abcdef {
param(
 [parameter(Mandatory=$True,Position=0,ValueFromPipeline=$True)]
 [ValidateNotNullOrEmpty]
 [String[]] $ComputerName,
 [parameter(Mandatory=$True,Position=1)]
 [ValidateNotNullOrEmpty()]
 [string[]] $folders,
 [parameter(Mandatory=$True,Position=2)]
 [ValidateNotNullOrEmpty()]
 [PSCredential] $cred
)

 foreach($computer in $ComputerName){
   foreach($folder in $folders{
   $s = { New-Item "C:\Documents and Settings\X\Desktop\$folder" -type directory }
   Invoke-Command -ComputerName $computer -ScriptBlock $s -Credential $cred 
   }
 }

}

Вы можете вызвать функцию следующим образом:

abcdef $computernames $folders $credentials

Или вы можете передать имена компьютеров, подобные этому, чтобы выполнить действие на всех компьютерах, которые возвращает ваша предыдущая команда (в этом примере все компьютеры AD):

Get-ADComputer -Filter * | abcdef $folders $credentials

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

person Paul    schedule 22.10.2014
comment
Спасибо, но что, если я хочу сделать две совершенно разные команды? например один для создания папки, а другой для изменения IP-адреса. все в одной функции - person Jendizer; 22.10.2014
comment
в этом случае вы должны определить второй блок сценария с другим действием и снова вызвать Invoke-Command или добавить действие в первый блок сценария (чего я бы не советовал вам делать) - person Paul; 22.10.2014
comment
Я попробую и дам вам знать, как это происходит. спасибо - person Jendizer; 22.10.2014

Вы делаете это, объявляя параметр папки в виде массива строк:

function abcdef {
    param([string[]]$Folder)
}

И затем вы выполняете foreach содержимого этого массива:

foreach ($f in $Folder) {
    # do something with $f
}

Вы вызываете эту функцию следующим образом:

abcdef 'folder1','folder2'

or

abcdef -Folder @('folder1','folder2')
person ojk    schedule 22.10.2014