powershell invoke命令

时间:2013-03-23 14:14:21

标签: powershell invoke-command

我正在尝试从服务器上运行DC上的以下脚本,并且我一直收到错误

Cannot bind parameter 'Identity'. Cannot convert value "1" to type "Microsoft.ActiveDirectory.Management.ADComputer". Error: 
"Invalid cast from 'System.Char' to 'Microsoft.ActiveDirectory.Management.ADComputer'."
    + CategoryInfo          : InvalidArgument: (:) [Get-ADComputer], ParameterBindingException
    + FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.ActiveDirectory.Management.Commands.GetADComputer
    + PSComputerName        : dc-test.com

脚本代码:

$Credentials = New-Object System.Management.Automation.PSCredential -ArgumentList $UserName, $password
$list = gc c:\test.txt
#example of what i would contain $i= Workstation1-"ou=test,dc=test,dc=com"

foreach ($i in $list)
{
  $s=$i.Split('-')

  $ScriptBlock = {
    param ($s) 
    Import-Module ActiveDirectory

    get-adcomputer $s[0] | Move-ADObject -TargetPath $s[1]
  }

  invoke-command -computer dc.test.com -Argu $s -scriptblock $ScriptBlock -cred $Credentials 
}
}

当我在DC上运行它时工作正常。有人能指出我正确的方向吗?

1 个答案:

答案 0 :(得分:0)

这里的问题是您将数组作为-ArgumentList参数的参数传递。这不会按照你期望的方式工作。您不是将数组作为一个整体传递,而是将此数组的每个元素传递给给定参数。只有一个,所以只使用传递数组的第一个元素。

要了解正在发生的事情,请尝试以下方法:

$script = {
    param ($array?)
    $array?[0]
}

$array = 'a1-b2-c3'.Split('-')

Invoke-Command -ScriptBlock $script -ArgumentList $array
Invoke-Command -ScriptBlock $script -ArgumentList (,$array)

因此,您可以确保不会销毁您的数组(使用一元逗号)或只更改代码并假设您将分别获得两个参数:

$ScriptBlock = {
    param ($comp, $target) 
    Import-Module ActiveDirectory
    get-adcomputer $comp | Move-ADObject -TargetPath $target
}
BTW:我怀疑当前的TargetPath可能存在问题 - 它会被带引号传递给cmdlet,因此Move-ADObject可能会失败。