将字符串$ variable传递给invoke-command scriptblock参数-name

时间:2016-10-25 18:42:20

标签: windows powershell

我目前正在编写一个相对简单的PowerShell脚本来重启/停止/启动远程计算机上的服务。在我决定将$Service变量传递到-Name Scriptblock中的Invoke-Command参数之前,一切正常。我知道我做错了什么或遗忘了什么但是你的帮助会非常感激。这是代码中的代码,突出显示了问题

[CmdletBinding()] Param([Parameter(Mandatory=$True,Position=1)]
  [string]$Server,
  [Parameter(Mandatory=$True)]
  [string]$Service) 
get-service -ComputerName $Server -Name "$Service"

Write-Host("------------------------------------------------")
Write-Host("Execute action on selected service: ")
Write-Host("1. Restart service ")
Write-Host("2. Stop service ")
Write-Host("3. Start service")
$choice = Read-Host -Prompt "Your choice"

switch ($choice)
{
    1 {Invoke-command -Computername $Server {Restart-Service -Name "$Service" } }
    2 {Invoke-command -ComputerName $Server {Stop-Service  -Name "$Service" } }
    3 {Invoke-command -ComputerName $Server {Start-Service -Name "$Service" } }
}

我试过了:

  • $ Service
  • 附近的单引号
  • $ Service附近的双引号
  • 在scriptblock中使用param([String] $ Service)

我一遍又一遍地得到同样的错误:

Cannot bind argument to parameter 'Name' because it is an empty string.
    + CategoryInfo          : InvalidData: (:) [Stop-Service], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorEmptyStringNotAllowed,Microsoft.PowerShell.Commands.StopServiceCommand

我知道这与我尝试在远程计算机上运行本地变量这一事实有关。但有人可能会指出我正确的方向,我希望脚本只需使用强制参数

使用此处提到的方法How to pass local variable to Invoke-Command's我修改了代码,如下所示:

1 {Invoke-command -Computername $Server {param ([string] $srv = $Service) Restart-Service -Name "$srv" } }

不幸的是错误仍然存​​在

2 个答案:

答案 0 :(得分:1)

传递给scriptblock的参数语法如下:

(修正为@ pk198105建议)

Invoke-command -Computername $Server  {
param($service)
Restart-Service -Name "$Service" 
} -ArgumentList $service

参数列表和参数都是必需的

答案 1 :(得分:0)

好的部分归功于Abhijith pk

实现此目的的正确方法如下:

Invoke-command -Computername $Server  {param ($Service) Restart-Service -Name "$service" } -ArgumentList $service

谢谢