将字符串 $variable 传递给调用命令脚本块参数 -name

3 windows powershell

我目前正在编写一个相对简单的 PowerShell 脚本来重新启动/停止/启动远程计算机上的服务。一切都运行良好,直到我决定将$Service变量传递给脚本块-Name中的参数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" } }
}
Run Code Online (Sandbox Code Playgroud)

我努力了:

  • $Service 周围的单引号
  • $Service 周围双引号
  • 在脚本块中使用 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
Run Code Online (Sandbox Code Playgroud)

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

使用此处提到的方法如何将局部变量传递给 Invoke-Command's我修改了代码,如下所示:

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

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

Clu*_*fin 5

将参数传递到脚本块的语法应如下所示:

(按照@pk198105建议更正)

Invoke-command -Computername $Server  {
param($service)
Restart-Service -Name "$Service" 
} -ArgumentList $service
Run Code Online (Sandbox Code Playgroud)

argumentlist 和 param 都是必需的