2014-10-22 56 views
0

我想在同一时间进入参数时调用两个命令因此,例如,如果我是执行这个代码,我会把:同时调用两个命令的PowerShell

abcdef folder1 folder2

,它会在桌面上创建两个文件夹。

下面的代码只是一个例子,但我想知道这样做的正确语法。

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

然后你做的这个数组的内容一个foreach:

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

您调用此

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 
} 

回答

0
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 

或者你可以管Computernames这样做的所有计算机上以前的命令返回的动作(在这个例子中所有AD Computers):

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

另请注意,我不使用mkdir,如果其中一个可用于您正在执行的操作,则全部使用cmdlet

+0

感谢但如果我想要执行两个完全不同的命令呢?例如,一个创建一个文件夹,另一个更改一个IP地址。所有在一个功能 – Jendizer 2014-10-22 12:46:16

+0

在这种情况下,你会定义第二个脚本块与其他行动,再次调用Invoke-Command或添加行动到第一个scriptblock(我建议你不要这样做) – Paul 2014-10-22 12:48:25

+0

我会试试看,让你知道它是怎么回事。谢谢 – Jendizer 2014-10-22 12:53:46

0

通过声明的文件夹参数作为一个字符串数组做到这一点功能如下:

abcdef 'folder1','folder2' 

abcdef -Folder @('folder1','folder2')