Я находил скрипты, которые проверяют существование ВМ путем чтения их имен из файлов с выгрузкой результатов также в файл. Но мне нужен был скрипт, в который имена ВМ можно вставить. В определенных случаях это удобнее.
В простом виде скрипт будет выглядеть так:
Write-Host "Вставьте список серверов в текстовый документ"
Write-Host ""
$file = New-Item -Path $env:TEMP -Name "VM.txt" -Force
$openfile = Start-Process notepad.exe -FilePath $file.FullName -Wait
(Get-Content $file.FullName) | foreach-object {$_ -replace " ", ""} | set-content $file.FullName
$K=0
$VMs = ""
$VMs = Get-Content -Path $file.FullName
if ($vms.count -eq 0) {Write-Host "Cписок серверов пуст, работа скрипта завершена!" -ForegroundColor Red
break}
Foreach($vm in $VMs)
{
Try {
Get-VM -Name $vm -ErrorAction Stop | Out-Null
}
Catch {
Write-Host "VM $($vm) не найдена" -ForegroundColor Red
$K=1
}
}
if ($K -eq 0) {
Write-Host "Все виртуальные машины существуют"
}
Write-Host ""
Remove-Item -Path $file.FullName
Здесь используется конструкция
Try {
часть кода в которой ищем ошибку
}
Catch {
[тип ошибки, которую ищем]
код, который будет выполнен когда ошибка будет найдена
}
Используется переменная $K, которая принимает значение 1 когда хоть одна ВМ не найдена. Если же все машины найдены, то значение переменной не изменятся, и в этом случае выводится сообщение «Все виртуальные машины существуют».
В интерактивном:
Write-Host "Вставьте список серверов в текстовый документ"
Write-Host ""
$file = New-Item -Path $env:TEMP -Name "VM.txt" -Force
$openfile = Start-Process notepad.exe -FilePath $file.FullName -Wait
(Get-Content $file.FullName) | foreach-object {$_ -replace " ", ""} | set-content $file.FullName
$VM_List = [ordered]@{}
$K=0 # Показатель отсутствия хотя бы одной ВМ. Если все машины найдены, $K остается равным "0" и выводится соответствующее сообщение
$VMs = ""
$VMs = Get-Content -Path $file.FullName
if ($vms.count -eq 0) {Write-Host "Cписок серверов пуст, работа скрипта завершена!" -ForegroundColor Red
break}
Foreach($vm in $VMs)
{
Try {
Get-VM -Name $vm -ErrorAction Stop | Out-Null
$found = "существует"
}
Catch
{
Write-Host "VM $($vm) не найдена" -ForegroundColor Red
$K=1
$found="не существует"
}
Finally
{
$VM_List[$vm] = $found
}
}
if ($K -eq 0) {
Write-Host "Все виртуальные машины существуют"
}
Write-Host ""
Write-Host 'Вывести весь список ВМ? (существующих и не существующих)'
Write-Host '1. Вывести'
Write-Host '2. Нет'
Write-Host ''
$selected_menu_item = Read-Host 'Select menu item'
Switch($selected_menu_item){
1{Write-Host "Выбран п.1"
$VM_List | Out-GridView
}
2{Write-Host 'Вывод всего списка ВМ отменен пользователем'}
default {Write-Host 'Вывод всего списка ВМ отменен пользователем'}
}
Write-Host ""
Remove-Item -Path $file.FullName