В этой функции / скрипте много неправильного.Особенно в отношении логики (варианта использования) и конструктивной стороны этих усилий.Это действительно Франкенштейн, это означает, что, может быть, вы копируете и вставляете из разных источников.Форматирование также усложняет отслеживание.
Вам действительно нужно отступить от подхода к этому одному случаю за раз, чтобы убедиться, что вы идете по правильному пути.
У вас есть параметры, а затем больше запросов на ту же информацию.В операторе 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 не настраивается.