Моя функция выключит или запустит несколько виртуальных машин - PullRequest
0 голосов
/ 23 февраля 2019

Я пишу эту функцию, чтобы спросить пользователя, какую виртуальную машину он хочет использовать, ему придется выбирать из собственного списка Hyper-V.После этого он спросит, хочу ли я его включить или выключить.Я могу заставить выбранную ВМ включаться или выключаться, когда я ее выбираю.Однако, когда я запускаю функцию, она пытается пройти через все виртуальные машины в Hyper-V.Как я могу получить его, чтобы он мог просто включать или выключать виртуальную машину, которую я хочу?

(я также собираюсь вернуться и добавить опцию для сохранения виртуальной машины, если она включена.)

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 голосов
/ 23 февраля 2019

В этой функции / скрипте много неправильного.Особенно в отношении логики (варианта использования) и конструктивной стороны этих усилий.Это действительно Франкенштейн, это означает, что, может быть, вы копируете и вставляете из разных источников.Форматирование также усложняет отслеживание.

Вам действительно нужно отступить от подхода к этому одному случаю за раз, чтобы убедиться, что вы идете по правильному пути.

У вас есть параметры, а затем больше запросов на ту же информацию.В операторе if есть переменная, которой нет в разделе параметров или подсказок, поэтому она всегда будет пустой.

Вы специально запрашиваете все виртуальные машины, ...

$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

... но вы говорите, что хотите только один, но в своих подсказках вы просите два.

$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]"

У вас также есть эти параметры, так что это просто странно.Только вставьте в блок param то, что вы хотите передать или запросить.

Почему у вас есть блок pram, а затем куча блоков Read-Host?

Это избыточно.Вы также можете выполнить Read-Host в блоке Param.Таким образом, вы можете передать все параметры сразу, или, если вы забудете об этом, появятся подсказки.

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

Вы также можете использовать проверочный набор, чтобы гарантировать, что пользователь может выбрать только вариант, а затем ввести его.

Вы также можете просто показать список виртуальных машин дляиспользуйте для выбора, используя динамический набор параметров или используя Out-GridView для выбора пользователем.

У вас очень длинный оператор if, который просто является кандидатом в оператор switch, чтобы сделать его более кратким.

Вы передаете все свои имена гостей в своих операторах if.Почему, когда вы говорите, что хотите только одного.

Это произойдет, поскольку это все для вас ново.Это нормально, но стоит потратить несколько бесплатных бесплатных онлайн-сессий перед тем, как подключиться. Если это так, посмотрите эти обсуждения и вопросы и ответы.

См. Эти ресурсы. Ресурсы PowerShell

Помощь кому-то с PowerShell

И это ...

Документы MS PowerShell

ИМХО, вам следует подходить к этому по-другому, чтобы сделать его более лаконичным, легким для понимания, расширения, обслуживания и устранения неполадок.

То, что у вас есть, может быть действительно сведено к этому, отчто ты сейчас показываешь.Опять же, есть много способов сделать X или Y, это только один из способов.

Function Get-Ors 
{
    [cmdletbinding()]
    [Alias('ors')]

    param 
    (

    )

    $VMName = ( Get-VM | 
    Select-Object -Property Name, State, Status | 
    Out-GridView -OutputMode Single -Title 'Select a target VM you want to use.')    

    $IO = ( 'On','Off'| 
    Out-GridView -OutputMode Single -Title 'Select On or Off to start or stop the target VM.')     

    switch ($IO) 
        { 
            On {
                "Attempting to start $($VMName.Name)"
                Start-VM -Name $VMName
            } 
            Off {
                "Attempting to stop $($VMName.Name)"
                Stop-VM -Name $VMName.Name
            } 
            default {Write-Warning -Message "$($VMName.Name) state could not be determined"}
        }
}

PowerShell автоматически сгенерирует ответ на основе текущего состояния, если оно недопустимо для запроса.

Если вас не интересует встроенный Out-GridView, вы можете создать и использовать окно сообщений, WinForm или WPF или использовать PowerShell с другим подходом графического интерфейса PoorMan, используя командлет Show-Command.GUI-подход PoorMan не настраивается.

...