我的功能将关闭或启动多个VM

时间:2019-02-23 00:52:45

标签: function powershell powershell-v5.0

我正在编写此功能来询问用户要使用的VM,他们必须从自己的Hyper-V列表中进行选择。之后,它将询问我是否要打开或关闭它。选择虚拟机后,可以打开或关闭该虚拟机。但是,当我运行该功能时,它将尝试遍历Hyper-V中的所有VM。如何获得它,以便它可以打开或关闭我想要的VM?

(我还将返回并添加一个选项以保存VM(如果已打开)。)

Function get-ORS {

param ($R, $O, $S, $name, $off, $on)

$name= Read-Host "What VM would you like to turn on use?"
$IO= Read-Host "Would you like to turn on/off your VM?: [On] [Off]"
$R= Get-VM | where {$_.State -eq 'Running'}
$O= Get-VM | where {$_.State -eq 'Off'}
$S= Get-VM | Where {$_.State -eq 'saved'}
$Off= Get-VM | where {$_.state -eq 'Running'} | Stop-VM
$on= Get-VM | where {$_.State -eq 'Off'} | Start-VM

if ($IO -eq $on) {
  try
  {
  Start-VM -Name $name
  }

catch
{
echo ("Could not start" + $name)
}
}
elseif ($O){
 try
{
Start-VM -Name $name
echo ("Starting "+ $name)
}
catch
{
echo "Could not start the VM."
}
}

elseif ($R){
try
{
echo "Your VM is currently running."
}
catch
{
echo "Something went wrong."
}
}

elseif ($S) {
try
{
Start-VM -Name $name
echo ("Starting your from a saved state " + $name)
}
catch
{
echo "Could not start the saved VM."
}
}

if ($IO -eq $off){
try
{
Stop-VM -Name $name
}
catch
{
echo ("Could not turn off " + $name)
}
}

}

1 个答案:

答案 0 :(得分:0)

此功能/脚本有很多错误。特别是在逻辑(用例)和构建方面。这确实是科学怪人,这意味着,也许您是从不同的来源进行复制和粘贴。格式也使它很难遵循。

您确实需要一次回退一个用例的方法,以确保您走的路正确。

您有参数,然后会有更多提示提示相同的信息。在if语句中有一个变量,该变量不在参数或提示部分中,因此它将始终为空。

您专门要求所有VM,...

groups:
  - name: disk_usage
    interval: 5s
    rules:
    - record: node_exporter:node_filesystem_free:fs_used_percents
      expr: 100 - 100 * ( node_filesystem_free{mountpoint="/"} / node_filesystem_size{mountpoint="/"} )

    - name: alerting_rules
      rules:
        - alert: DiskSpace10%Free
          expr: node_exporter:node_filesystem_free:fs_used_percents >= 90
          labels:
            severity: moderate
          annotations:
            summary: "Instance {{ $labels.instance }} is low on disk space"
            description: "{{ $labels.instance }} has only {{ $value }}% free."

...但是您说的是只想要一个,但是在提示中您要的是两个。

$R = Get-VM | where {$_.State -eq 'Running'}
$O = Get-VM | where {$_.State -eq 'Off'}
$S = Get-VM | Where {$_.State -eq 'saved'}
$Off = Get-VM | where {$_.state -eq 'Running'} | Stop-VM
$on = Get-VM | where {$_.State -eq 'Off'} | Start-VM

您也将这些作为参数,所以这很奇怪。仅将要传递或提示的内容放在参数块中。

为什么您有一个婴儿车座,然后又有一堆读主机座?

那是多余的。您也可以在Param块中执行读取主机。因此,您可以一次传递所有参数,或者如果忘记了,则会出现提示。

$name = Read-Host "What VM would you like to turn on use?"
$IO   = Read-Host "Would you like to turn on/off your VM?: [On] [Off]"

您还可以使用验证集来确保用户只能选择一个选项,然后再键入它。

您还可以通过使用动态参数集或使用Out-GridView来显示供用户选择的VM列表,以供选择。

您有一个很长的if语句,它只是switch语句的候选者,以使其更加简洁。

您要在if语句中传递所有来宾名称。为什么,当你说只想要一个的时候。

这是关闭的,因为这对您来说都是新的。没关系,但是值得一试,然后再参加一些快速的免费在线会议。如果是这种情况,请参阅这些讨论和问答。

请参阅这些资源。 PowerShell Resources

Helping out someone with PowerShell

这...

MS PowerShell Docs

恕我直言,您应该采用不同的方法来使其更简洁,更易于理解,扩展,维护和排除故障。

从现在显示的内容来看,您拥有的实际上可以简化为仅此而已。同样,执行X或Y的方法有很多,这只是一种方法。

param 
(
    $name = (Read-Host "What VM would you like to turn on use?"),
    $IO   = (Read-Host "Would you like to turn on/off your VM?: [On] [Off]")
)


$R   = Get-VM | where {$_.State -eq 'Running'}
$O   = Get-VM | where {$_.State -eq 'Off'}
$S   = Get-VM | Where {$_.State -eq 'saved'}
$Off = Get-VM | where {$_.state -eq 'Running'} | Stop-VM
$on  = Get-VM | where {$_.State -eq 'Off'} | Start-VM

如果对请求无效,PowerShell将基于当前状态自动生成响应。

如果您不需要内置的Out-GridView,则可以使用Show-Command cmdlet来构造和使用messagebox或WinForm或WPF或使用PowerShell其他PoorMan的GUI方法。 PoorMan的GUI方法不可自定义。