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