команда вызова powershell

Я пытаюсь запустить следующий скрипт на контроллере домена с сервера, и я продолжаю получать сообщение об ошибке

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, он работает нормально. Может ли кто-нибудь указать мне в правильном направлении?


person user1221996    schedule 23.03.2013    source источник


Ответы (1)


Проблема здесь в том, что вы передаете массив в качестве аргумента для параметра -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 - он будет передан командлету с кавычками, поэтому Move-ADObject может завершиться ошибкой.

person BartekB    schedule 23.03.2013