我正在编写此功能来询问用户要使用的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)
}
}
}
答案 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
这...
恕我直言,您应该采用不同的方法来使其更简洁,更易于理解,扩展,维护和排除故障。
从现在显示的内容来看,您拥有的实际上可以简化为仅此而已。同样,执行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方法不可自定义。