2016-12-12 3 views
0

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

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

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

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

Код ::

$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 

Error ::

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

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

+0

Нет, 'Invoke-Command' не использует удаленные переменные (динамическая природа скриптов означает, что было бы очень сложно узнать, какие из них удалены вообще), поэтому на удаленном конце нет переменной' $ svc', когда scriptblock передается. Начиная с версии 3.0, вы можете исправить это с помощью '$ using'. См. ['About_Remote_Variables'] (https://msdn.microsoft.com/powershell/reference/5.1/Microsoft.PowerShell.Core/about/about_Remote_Variables). –

+0

Спасибо 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 – DotSlashCrash

ответ

0

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

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

$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 

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

+0

Это именно то, что проблема был. Я сделал перерыв и вернулся к нему и поймал это. Я ценю свежие глаза и ответ. – DotSlashCrash

+0

Спасибо @DotSlashCrash. Рад помочь вам –