Hyper-V'yi PowerShell ile Genişletme
Son zamanlarda daha fazlasını daha hızlı halletmenin bir yolu olarak PowerShell türü uzantıları kullanmam hakkında yazıyorum. Ya da en azından bana minimum çabayla istediğim bilgiyi ver. Hyper-V'yi çok kullanıyorum ve Hyper-V cmdlet'leri çok değerli. Get-VM gibi bir komut çok fazla bilgi sağlarken, her zaman daha fazlasını istiyor gibiyim, bu yüzden Hyper-V ile ilgili tür uzantılarımı sizlerle paylaşayım dedim. Hyper-V'ye ihtiyacınız olmasa veya kullanmasanız bile tekniklerimi faydalı bulabilirsiniz.
Hyper-V sanal makinesinin nesne türü Microsoft.HyperV.PowerShell.VirtualMachine'dir ve Get-VM'yi çalıştırıp Get-Member'e aktararak kolayca elde edebilirsiniz. Update-TypeData'yı kullanarak tanımlamak istediğim bir dizi komut dosyası özelliği var. Bunlar, değerin bir PowerShell betik bloğu tarafından hesaplandığı özelliklerdir. Örneğin, bir sanal makinenin yapılandırılmış disk dosyalarından herhangi birinin eksik olup olmadığını hızlı bir şekilde görebilmek istiyorum. Bunun gibi bir komutu çalıştırabilirim:
Ancak bu bilgiyi sık sık istersem, bu çok fazla yazmak anlamına gelir. Bunun yerine bu komut dosyası bloğuyla bir komut dosyası özelliği oluşturabilirim. Bu sürüm, VM'nin birden fazla diske sahip olabileceğini ve bunlardan bir veya daha fazlasının eksik olabileceğini dikkate alır.
{
if ($this.HardDrives) {
#test if there are any false results
if ( ($this | Get-VMHardDiskDrive | Test-Path) -contains $False ) {
$False
}
else {
$True
}
}
else {
#no hard drive files configured or found
$false
}
}
İlgili bir notta, sanal makinenin ne kadar disk alanı tükettiğini bilmek istiyorum.
{
$stat = Get-VMHardDiskDrive -VMName $this.vmname | Get-Item | Measure-Object -Property length -sum
[math]::Round($stat.sum/1GB,2)
}
Ayrıca yapılandırma dosyasının yolunu da bilmek isterim. Bu, sanal makinenin kimliğiyle eşleşen dosya adına sahip bir vmcx dosyası olacaktır.
Join-path -Path "$($this.configurationLocation)\Virtual Machines" -ChildPath "$($this.vmid).vmcx" -Resolve
Bunları ve birkaçını daha tanımlamak için PowerShell profil betiğimde buna benzer bir kod kullanıyorum.
Anahtarın özellik adı olacağı ve değerin kullanacağım komut dosyası bloğu olacağı bir karma tablosu tanımlarım.
$extensions = @{
TestVHD = {
if ($this.HardDrives) {
#test if there are any false results
if ( ($this | Get-VMHardDiskDrive | Test-Path) -contains $False ) {
$False
}
else {
$True
}
}
else {
#no hard drive files configured or found
$false
}
}
ConfigurationFile = {
Join-path -Path "$($this.configurationLocation)\Virtual Machines" -ChildPath "$($this.vmid).vmcx" -Resolve
}
Diskpath = {$this.Harddrives.path}
Running = { if ($this.state -eq 'Running') {$True} else { $False}}
SizeGB = {
$stat = Get-VMHardDiskDrive -VMName $this.vmname | Get-Item | Measure-Object -Property length -sum
[math]::Round($stat.sum/1GB,2)
}
}
Daha sonra Update-TypeData ile uyarlayacağım parametrelerin karma tablosunu tanımlarım.
$params = @{
TypeName = 'Microsoft.HyperV.PowerShell.VirtualMachine'
MemberType = 'ScriptProperty'
MemberName = ''
Value = ''
Force = $True
}
Son adım, uzantıları numaralandırmak ve tür verilerini güncellemektir.
$extensions.GetEnumerator() | foreach {
$params.memberName = $_.key
$params.value = $_.value
# Write-Host "Creating script property $($_.key)" -ForegroundColor cyan
Update-Typedata @params
}
Karma tabloları kullanarak kodum düzenli ve okunması daha kolay oldu.
Ve şimdi bunun gibi komutları çalıştırabilirim:
PowerShell'in benim ihtiyaçlarımı karşılayacak esnekliği sağlaması hoşuma gidiyor. Her zaman olduğu gibi yorum ve geri bildirimlere açığız.