我目前正在编写一个相对简单的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" } }
}
我试过了:
我一遍又一遍地得到同样的错误:
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" } }
不幸的是错误仍然存在
答案 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
谢谢