【发布时间】:2016-10-26 11:49:10
【问题描述】:
我目前正在编写一个相对简单的 PowerShell 脚本来重新启动/停止/启动远程机器上的服务。在我决定将$Service 变量传递给Invoke-Command 脚本块中的-Name 参数之前,一切都运行良好。我知道我做错了什么或忘记了什么,但您的帮助将不胜感激。这是突出显示给我问题的部分的代码
[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 周围的双引号
- 在脚本块中使用 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" } }
不幸的是,错误仍然存在
【问题讨论】:
-
类似是的,是的,我已经尝试过这种方法。它不断返回 -Name 参数是一个空字符串
-
试过stackoverflow.com/questions/36339616 方法一样效果一直返回空字符串错误
标签: windows powershell