Powershell 调用cmdlet时使用变量作为动词

Powershell 调用cmdlet时使用变量作为动词,powershell,Powershell,我正在尝试编写一个脚本来启动、停止或重新启动远程计算机上的服务 我发现: Start-Service -InputObject $(Get-Service -Computer COMPUTER1 -Name spooler) 并开始围绕它构建我的脚本 这就是我所拥有的: $Action = Read-Host "Start, Stop or Restart service?" $Serv = Read-Host "Service name?" $Comp = Read-Host "Comput

我正在尝试编写一个脚本来启动、停止或重新启动远程计算机上的服务

我发现:

Start-Service -InputObject $(Get-Service -Computer COMPUTER1 -Name spooler)
并开始围绕它构建我的脚本

这就是我所拥有的:

$Action = Read-Host "Start, Stop or Restart service?"
$Serv = Read-Host "Service name?"
$Comp = Read-Host "Computer name?"
"$Action"-Service -InputObject $(Get-Service -Computer "$Comp" -Name "$Serv")
运行此脚本时,出现以下错误:

在U:\Serv.ps1:4 char:10
+“$Action”-服务-输入对象$(获取服务-计算机“$Comp”-名称“$Serv”)
+          ~~~~~~~~
表达式或语句中出现意外标记“-Service”。
在U:\Serv.ps1:4 char:19
+“$Action”-服务-输入对象$(获取服务-计算机“$Comp”-名称“$Serv”)
+                   ~~~~~~~~~~~~
我试过这样做:

$Action = Read-Host "Start, Stop or Restart service?"
$Action = $Action + "-Service"
$Serv = Read-Host "Service name?"
$Comp = Read-Host "Computer name?"
"$Action" -InputObject $(Get-Service -Computer "$Comp" -Name "$Serv")
$Action = Read-Host "Start, Stop or Restart service?"
$Serv   = Read-Host "Service name?"
$Comp   = Read-Host "Computer name?"

$svc = Get-Service -Computer $Comp -Name $Serv
switch ($Action) {
  'Start'   { $svc | Start-Service }
  'Stop'    { $svc | Stop-Service }
  'Restart' { $svc | Restart-Service }
}
但我得到了一个类似的错误:

在U:\Serv.ps1:5 char:11
+“$Action”-InputObject$(获取服务-计算机“$Comp”-名称“$Serv”)
+           ~~~~~~~~~~~~
表达式或语句中出现意外标记'-InputObject'。
在U:\Serv.ps1:5 char:24
+“$Action”-InputObject$(获取服务-计算机“$Comp”-名称“$Serv”)
+                        ~~
表达式或语句中出现意外标记“$(”。
+CategoryInfo:ParserError:(:)[],ParseException
+FullyQualifiedErrorId:意外终止
表达式或语句中出现意外标记'-InputObject'。
+CategoryInfo:ParserError:(:)[],ParseException
+FullyQualifiedErrorId:意外终止

如何将输入“开始”、“停止”或“重启”传递给命令的动词部分?

< P>这是一个相当复杂的用PultS壳管理服务的方式。考虑这样做而不是:

$Action = Read-Host "Start, Stop or Restart service?"
$Action = $Action + "-Service"
$Serv = Read-Host "Service name?"
$Comp = Read-Host "Computer name?"
"$Action" -InputObject $(Get-Service -Computer "$Comp" -Name "$Serv")
$Action = Read-Host "Start, Stop or Restart service?"
$Serv   = Read-Host "Service name?"
$Comp   = Read-Host "Computer name?"

$svc = Get-Service -Computer $Comp -Name $Serv
switch ($Action) {
  'Start'   { $svc | Start-Service }
  'Stop'    { $svc | Stop-Service }
  'Restart' { $svc | Restart-Service }
}
如果出于某种原因必须构造cmdlet名称,则必须使用调用运算符(
&
):

如果没有该操作符,PowerShell将无法将您的字符串识别为cmdlet,但会(尝试)通过
输出默认值来打印它

也可以考虑使用主机UI的方法来代替<代码>读取主机< /代码>:

$message  = 'Manage Services'
$question = 'Start, Stop or Restart service?'

$choices = New-Object Collections.ObjectModel.Collection[Management.Automation.Host.ChoiceDescription]
$choices.Add((New-Object Management.Automation.Host.ChoiceDescription -ArgumentList '&Start'))
$choices.Add((New-Object Management.Automation.Host.ChoiceDescription -ArgumentList 'Sto&p'))
$choices.Add((New-Object Management.Automation.Host.ChoiceDescription -ArgumentList '&Restart'))

$Action = $Host.UI.PromptForChoice($message, $question, $choices, 0)

switch ($Action) {
  0 { $svc | Start-Service }
  1 { $svc | Stop-Service }
  2 { $svc | Restart-Service }
}
代码如下:

$message  = 'Manage Services'
$question = 'Start, Stop or Restart service?'
$message
Write-Host
$Comp = Read-Host "Computer name?"
Write-Host
$ListServ = Read-Host "List services on remote computer? y or n"
If ($ListServ -eq "y")
  {
    Get-Service -ComputerName $Comp
  }
Write-Host
$Serv = Read-Host "Service name?"
Write-Host

$choices = New-Object Collections.ObjectModel.Collection[Management.Automation.Host.ChoiceDescription]
$choices.Add((New-Object Management.Automation.Host.ChoiceDescription -ArgumentList '&Start'))
$choices.Add((New-Object Management.Automation.Host.ChoiceDescription -ArgumentList 'Sto&p'))
$choices.Add((New-Object Management.Automation.Host.ChoiceDescription -ArgumentList '&Restart'))

$Action = $Host.UI.PromptForChoice($message, $question, $choices, 0)
$svc = Get-Service -ComputerName $Comp -Name $Serv
switch ($Action) {
  0 { $svc | Start-Service }
  1 { $svc | Stop-Service }
  2 { $svc | Restart-Service }
}
$svc

第一组代码工作得很好。谢谢!我无法使用PromptForChoice()获得第二部分代码。我可能没有加载该部分所需的内容。错误的第一部分为:New Object:找不到类型[Collection.ObjectModel.Collection[Management.Automation.Host.ChoiceDescription]]:验证是否加载了包含此类型的程序集。@urtonbay您运行的是哪个PowerShell版本?我运行的是版本4。@urtonbay我用版本4测试了代码,效果很好。如果您想继续解决此问题,请发布一个新问题,其中包含确切的代码和错误消息以及
$PSVersionTable。感谢您的帮助。我将这两段代码组合在一起,生成了一个功能齐全的服务管理脚本,它可以按照我的要求运行。