我正在编写一个PowerShell脚本,如果出现UPS故障或断电,它会将所有VM移动到另一个群集中的相应服务器。
如果发生断电,每台UPS都会在特定文件夹中创建一个日志文件,我的脚本应检测哪个UPS断电。
脚本应该每5分钟运行一次,如果UPS3断电,只需要关闭备份服务器。
我是PowerShell的新手,所以任何帮助或信息都会很棒。
这是我的概念:
$text1 = "UPS1"
$text2 = "UPS2"
$text3 = "UPS3"
$path = "C:\UPS"
$logfile = "C:\UPS\logs"
$timer = 10000
$date = Get-Date -Format g
$search_results = Get-ChildItem -Path $path | Where-Object { ((!$_.PSIsContainer))}
foreach ($file in $search_results) {
if ($file.Name -contains $text1) {
Get-VM -Location (Get-VMHost ‘ESX01’) | Move-VM -Destination (GetVM-Host ‘ESX03’)
Get-VM -Location (Get-VMHost ‘ESX02’) | Move-VM -Destination (GetVM-Host ‘ESX04’)
Write-Output "VMs moved from 01 to 03 and 02 to 04!" | Out-File $logfile -Append
}
elseif ($file.Name -contains $text2) {
Get-VM -Location (Get-VMHost ‘ESX03’) | Move-VM -Destination (GetVM-Host ‘ESX01’)
Get-VM -Location (Get-VMHost ‘ESX04’) | Move-VM -Destination (GetVM-Host ‘ESX02’)
Write-Output "VMs moved from 03 to 01 and 04 to 02!" | Out-File $logfile -Append
}
elseif ($file.Name -contains $text3) {
$timer.start
Stop-VMGuest -VM "Backup"
Write-Output "UPS3 lost power, shutdown of the backup server initiated!" | Out-File $logfile -Append
}
}
else
Out-File $logfile -InputObject $date
Write-Output "Alle UPS are running!" | Out-File $logfile -Append
-WhatIf
答案 0 :(得分:1)
将-File
与Get-ChildItem
一起使用只返回文件,这意味着您不再需要使用Where-Object
进行过滤。
另外,由于您仅使用Name
属性,因此使用Select-Object -ExpandProperty Name
表示您每次都可以使用$file
代替$file.Name
。
使用Switch Statement代替多个if/else
可以让代码更易于管理:
$path = "C:\UPS"
$logfile = "C:\UPS\log.txt"
$date = Get-Date -Format g
$files = Get-ChildItem -Path $path -File | Select-Object -ExpandProperty Name
foreach ($file in $files) {
switch -Wildcard ($file) {
"*UPS1*" {
Get-VM -Location (Get-VMHost "ESX01") | Move-VM -Destination (GetVM-Host "ESX03")
Get-VM -Location (Get-VMHost "ESX02") | Move-VM -Destination (GetVM-Host "ESX04")
Add-Content $logfile "`n$date - VMs moved from 01 to 03 and 02 to 04!"
}
"*UPS2*" {
Get-VM -Location (Get-VMHost "ESX03") | Move-VM -Destination (GetVM-Host "ESX01")
Get-VM -Location (Get-VMHost "ESX04") | Move-VM -Destination (GetVM-Host "ESX02")
Add-Content $logfile "`n$date - VMs moved from 03 to 01 and 04 to 02!"
}
"*UPS3*" {
Stop-VMGuest -VM "Backup"
Add-Content $logfile "`n$date - UPS3 lost power, shutdown of the backup server initiated!"
}
default {
Add-Content $logfile "`n$date - All UPS are running!"
}
}
}
我无法测试您的Get-VM
/ Move-VM
命令,因为我没有VMWare环境,所以我认为它们工作正常。< / p>