0

我正在尝试从服务器在 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 上运行它时,它工作正常。有人可以指出我正确的方向吗?

4

1 回答 1

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
}

顺便说一句:我怀疑当前的 TargetPath 可能存在问题 - 它将通过引号传递给 cmdlet,因此Move-ADObject可能会失败。

于 2013-03-23T16:58:44.783 回答