Invoke-Command не может связать ошибку аргумента

Invoke-Command не извлекает мои переменные?

Я поймал на этом. Я мог бы использовать xtra набор глаз!

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

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

Код::

$prepend = "ssssssssss"
$append = "sss"
$Fprepend = "tttttttt"
$Fappend = "tt"
$sitenumber = Read-Host 'What is the site number? ex. 1111'
 $name = $prepend + $sitenumber + $append  
 $Fname = $Fname = $Fprepend + $sitenumber + $Fappend

      $global:i=0
Get-service -Name Service,Instance,Server,Integration,Data,Message,FTP,Provider -ComputerName $name |
Select @{Name="Item";Expression={$global:i++;$global:i}},Name -OutVariable menu | Format-Table -AutoSize

$r = Read-Host "Select a service to restart by number"
$svc = $menu | where {$_.item -eq $r}

Write-Host "Restarting $($svc.name)" -ForegroundColor Green

Invoke-Command -ComputerName $Fname -ScriptBlock {Stop-Service -Name $svc.name -Force}
 sleep 3
Invoke-Command -ComputerName $Fname -ScriptBlock {Start-Service -Name $svc.name -Force}
Get-service -Name $svc.name -Computername $name

Ошибка::

Невозможно привязать аргумент к параметру «Имя», поскольку он имеет значение NULL. + CategoryInfo: InvalidData: (:) [Stop-Service], ParameterBindingValidationException + FullyQualifiedErrorId: ParameterArgumentValidationErrorNullNotAllowed, Microsoft.PowerShell.Commands.StopServiceCommand

Невозможно привязать аргумент к параметру «Имя», поскольку он имеет значение NULL. + CategoryInfo: InvalidData: (:) [Start-Service], ParameterBindingValidationException + FullyQualifiedErrorId: ParameterArgumentValidationErrorNullNotAllowed, Microsoft.PowerShell.Commands.StartServiceCommand


person DotSlashCrash    schedule 12.12.2016    source источник
comment
Нет, Invoke-Command не удаляет переменные (динамический характер сценариев означает, что было бы очень сложно понять, какие из них следует удаленно), поэтому на удаленном конце отсутствует переменная $svc, когда передается блок сценария. Начиная с версии 3.0, вы можете исправить это с помощью $using. См. about_Remote_Variables.   -  person Jeroen Mostert    schedule 12.12.2016
comment
Спасибо, Jeroen, я передал -ArgumentList $ Service в конце Invoke для вызова моей переменной. Я также хотел записать $ svc.name в отдельную переменную для дальнейшего использования. Теперь это выглядит так: на строку $ svc = $ menu | где {$ _item -eq $ r} $ Service = $ svc.name Invoke-Command -ComputerName $ Fname -ScriptBlock {Start-Service -Name $ args [0]} -ArgumentList $ Service   -  person DotSlashCrash    schedule 12.12.2016


Ответы (1)


Я изменил код, и теперь он работает нормально. Проблема, с которой вы столкнулись, заключается в том, что внутри блока скрипта $ svc не содержит никакого значения, потому что его даже нет в области видимости. Чтобы сделать это в рамках области, вы должны передать его как ArgumentList, и он должен быть инициирован внутри блока как param. Вот почему вы получаете Null

Используйте приведенный ниже код. Я только что изменил часть Invoke

$prepend = "ssssssssss"
$append = "sss"
$Fprepend = "tttttttt"
$Fappend = "tt"
$sitenumber = Read-Host 'What is the site number? ex. 1111'
 $name = $prepend + $sitenumber + $append  
 $Fname = $Fname = $Fprepend + $sitenumber + $Fappend

      $global:i=0
Get-service -Name Service,Instance,Server,Integration,Data,Message,FTP,Provider -ComputerName $name |
Select @{Name="Item";Expression={$global:i++;$global:i}},Name -OutVariable menu | Format-Table -AutoSize

$r = Read-Host "Select a service to restart by number"
$svc = $menu | where {$_.item -eq $r}

Write-Host "Restarting $($svc.name)" -ForegroundColor Green
# You have to pass the $svc as an argumentlist and the same has to be initiated as param inside the script block.
Invoke-Command -ComputerName $Fname -ScriptBlock {param($svc)Stop-Service -Name $svc.name -Force} -ArgumentList $svc
 sleep 3
Invoke-Command -ComputerName $Fname -ScriptBlock {param($svc)Start-Service -Name $svc.name -Force} -ArgumentList $svc
Get-service -Name $svc.name -Computername $name

Надеюсь, теперь вы понимаете суть проблемы.

person Ranadip Dutta    schedule 12.12.2016
comment
В этом и заключалась проблема. Я сделал перерыв, вернулся к этому и поймал это. Ценю свежий взгляд и ответ. - person DotSlashCrash; 12.12.2016
comment
Спасибо @DotSlashCrash. Рад помочь вам - person Ranadip Dutta; 13.12.2016