Zum Inhalt wechseln


Foto

Get-VM Parsen ?

Hyper-V

  • Bitte melde dich an um zu Antworten
15 Antworten in diesem Thema

#1 BpDk

BpDk

    Newbie

  • 53 Beiträge

 

Geschrieben 10. April 2017 - 10:08

Hallo Leute,

 

gibt es die Möglichkeit den Befehl "Get-VM" so zu parsen, dass die Ausgabe in folgender Syntax ist?

 

"VM-Name," "VM-Name", ......

 

Ich würde gerne mein Veeam Backup Skript dynamisch aufbauen, damit das Skript nicht jedes mal bei einer VM-Neuanlage angepasst werden muss.

 

Vielen Dank,

BpDK

 

 


Bearbeitet von BpDk, 10. April 2017 - 10:09.


#2 NilsK

NilsK

    Expert Member

  • 12.332 Beiträge

 

Geschrieben 10. April 2017 - 11:11

Moin,

 

"parsen" im engeren Sinne ist das nicht, was du vorhast, aber ein simpler Weg wäre dieser:

$Ausgabe = ''
$VMs = (Get-VM)
foreach ($VM in $VMs) {
    $Ausgabe = $Ausgabe + '"' + $VM.Name + '",'
}
$Ausgabe.TrimEnd(',')

Gruß, Nils


  • BpDk gefällt das

Nils Kaczenski

MVP Cloud and Datacenter Management
... der beste Schritt zur Problemlösung: Anforderungen definieren!

Kostenlosen Support gibt es nur im Forum, nicht privat!


#3 BpDk

BpDk

    Newbie

  • 53 Beiträge

 

Geschrieben 10. April 2017 - 11:33

Moin,

 

"parsen" im engeren Sinne ist das nicht, was du vorhast, aber ein simpler Weg wäre dieser:

$Ausgabe = ''
$VMs = (Get-VM)
foreach ($VM in $VMs) {
    $Ausgabe = $Ausgabe + '"' + $VM.Name + '",'
}
$Ausgabe.TrimEnd(',')

Gruß, Nils

 

Vielen Dank für deine schnelle Hilfe!!!

 

Leider gibt mir der Code nichts aus, wenn ich diesen am Hyper-V Host ausführe.



#4 MurdocX

MurdocX

    Board Veteran

  • 547 Beiträge

 

Geschrieben 10. April 2017 - 11:36

Leider gibt mir der Code nichts aus, wenn ich diesen am Hyper-V Host ausführe.

 

Als "Admin" ausgeführt?


Mit freundlicher Unterstützung
Jan


#5 NilsK

NilsK

    Expert Member

  • 12.332 Beiträge

 

Geschrieben 10. April 2017 - 11:36

Moin,

 

du hast die PowerShell (besser die PowerShell ISE) ausdrücklich als Admin gestartet?

 

Gruß, Nils


Nils Kaczenski

MVP Cloud and Datacenter Management
... der beste Schritt zur Problemlösung: Anforderungen definieren!

Kostenlosen Support gibt es nur im Forum, nicht privat!


#6 MurdocX

MurdocX

    Board Veteran

  • 547 Beiträge

 

Geschrieben 10. April 2017 - 11:39

Hallo Leute,

 

gibt es die Möglichkeit den Befehl "Get-VM" so zu parsen, dass die Ausgabe in folgender Syntax ist?

 

"VM-Name," "VM-Name", ......

 

Ich würde gerne mein Veeam Backup Skript dynamisch aufbauen, damit das Skript nicht jedes mal bei einer VM-Neuanlage angepasst werden muss.

 

Vielen Dank,

BpDK

 

Oder kürzer als Nils :p :

( get-vm | Select-Object -ExpandProperty Name ) -join ','

Mit freundlicher Unterstützung
Jan


#7 NilsK

NilsK

    Expert Member

  • 12.332 Beiträge

 

Geschrieben 10. April 2017 - 11:50

Moin,

 

daran hatte ich auch erst gedacht, aber da fehlen dann die Anführungsstriche. Wenn man Leerzeichen oder Sonderzeichen im VM-Namen hat, kann es dann sein, dass Veeam damit nicht umgehen kann. Daher der Umstand mit der Schleife.

 

Gruß, Nils

PS. wenn man bei Einzeilern bleiben möchte, könnte man es schmutzig aber auch so machen:

'"' + (( get-vm | Select-Object -ExpandProperty Name ) -join '","') + '"'

  • BpDk und MurdocX gefällt das

Nils Kaczenski

MVP Cloud and Datacenter Management
... der beste Schritt zur Problemlösung: Anforderungen definieren!

Kostenlosen Support gibt es nur im Forum, nicht privat!


#8 MurdocX

MurdocX

    Board Veteran

  • 547 Beiträge

 

Geschrieben 10. April 2017 - 11:57

PS. wenn man bei Einzeilern bleiben möchte, könnte man es schmutzig aber auch so machen:

'"' + (( get-vm | Select-Object -ExpandProperty Name ) -join '","') + '"'

 

Quck and dirty  :D

 

Ich hab beim Programmieren / Skripten letztlich gemerkt, dass quick and dirty im Endeffekt mehr arbeit macht. Letztlich beim debuggen oder anpassen geht dann die Zeit die man sich gespart hat wieder flöten.


Mit freundlicher Unterstützung
Jan


#9 BpDk

BpDk

    Newbie

  • 53 Beiträge

 

Geschrieben 10. April 2017 - 12:06

Ist mir fast peinlich, aber ja läuft nun.

 

Ich bedanke mich bei allen für die schnelle Hilfe.


 

Moin,

 

daran hatte ich auch erst gedacht, aber da fehlen dann die Anführungsstriche. Wenn man Leerzeichen oder Sonderzeichen im VM-Namen hat, kann es dann sein, dass Veeam damit nicht umgehen kann. Daher der Umstand mit der Schleife.

 

Gruß, Nils

PS. wenn man bei Einzeilern bleiben möchte, könnte man es schmutzig aber auch so machen:

'"' + (( get-vm | Select-Object -ExpandProperty Name ) -join '","') + '"'

 

Nur dass ich es auch verstehe. Was macht hier genau der Parameter -join?



#10 MurdocX

MurdocX

    Board Veteran

  • 547 Beiträge

 

Geschrieben 10. April 2017 - 12:09

Nur dass ich es auch verstehe. Was macht hier genau der Parameter -join?

 

Die Ausgabe aus Select-Object ist in diesem Fall ein String-Array. Dieses Array kannst du mit "-join" auflösen und wieder in einen String verwandeln. Das "," besagt nur, dass die Objekte beim zusammenfügen in einen String durch ein Komma getrennt werden.

 

About_Join | Technet

https://technet.micr...y/hh847757.aspx


Mit freundlicher Unterstützung
Jan


#11 BpDk

BpDk

    Newbie

  • 53 Beiträge

 

Geschrieben 13. April 2017 - 07:27

Vielen Dank für euer Feedback.

 

Kennt sich jemand zufällig mit Veeam Backup & Replication aus und sichert seine VMs damit? Meine Intention war eigentlich das Powershell Skript so anzupassen, dass die vorhandenen VM's automatisch ermittelt werden.

 

Leider funktioniert das nicht so einfach, wie ich ich mir das vorgestellt hatte.

 

Jemand ein Tipp?

# Author: Vladimir Eremin
# Created Date: 3/24/2015
# http://forums.veeam.com/member31097.html
# 

##################################################################
#                   User Defined Variables
##################################################################

# Names of VMs to backup separated by comma (Mandatory). For instance, $VMNames = “VM1”,”VM2”
$Ausgabe = ''
$VMs = (Get-VM)
foreach ($VM in $VMs) {
    $Ausgabe = $Ausgabe + '"' + $VM.Name + '",'
}

$VMNames = $Ausgabe.trimEnd(',')

# Name of vCenter or standalone host VMs to backup reside on (Mandatory)
$HostName = "DMZ01"

# Directory that VM backups should go to (Mandatory; for instance, C:\Backup)
$Directory = "F:\HyperV"

# Desired compression level (Optional; Possible values: 0 - None, 4 - Dedupe-friendly, 5 - Optimal, 6 - High, 9 - Extreme) 
$CompressionLevel = "5"

# Quiesce VM when taking snapshot (Optional; VMware Tools are required; Possible values: $True/$False)
$EnableQuiescence = $True

# Protect resulting backup with encryption key (Optional; $True/$False)
$EnableEncryption = $False

# Encryption Key (Optional; path to a secure string)
$EncryptionKey = ""

# Retention settings (Optional; By default, VeeamZIP files are not removed and kept in the specified location for an indefinite period of time. 
# Possible values: Never , Tonight, TomorrowNight, In3days, In1Week, In2Weeks, In1Month)
$Retention = "Never"

##################################################################
#                   Notification Settings
##################################################################

# Enable notification (Optional)
$EnableNotification = $false

# Email SMTP server
$SMTPServer = ""

# Email FROM
$EmailFrom = "" 

# Email TO
$EmailTo = ""

# Email subject
$EmailSubject = "HyperV Backup"

##################################################################
#                   Email formatting 
##################################################################

$style = "<style>BODY{font-family: Arial; font-size: 10pt;}"
$style = $style + "TABLE{border: 1px solid black; border-collapse: collapse;}"
$style = $style + "TH{border: 1px solid black; background: #dddddd; padding: 5px; }"
$style = $style + "TD{border: 1px solid black; padding: 5px; }"
$style = $style + "</style>"

##################################################################
#                   End User Defined Variables
##################################################################

#################### DO NOT MODIFY PAST THIS LINE ################
Asnp VeeamPSSnapin

$Server = Get-VBRServer -name $HostName
$MesssagyBody = @()

foreach ($VMName in $VMNames)
{
  $VM = Find-VBRHvEntity -Name $VMName -Server $Server
  
  If ($EnableEncryption)
  {
    $EncryptionKey = Add-VBREncryptionKey -Password (cat $EncryptionKey | ConvertTo-SecureString)
    $ZIPSession = Start-VBRZip -Entity $VM -Folder $Directory -Compression $CompressionLevel -DisableQuiesce:(!$EnableQuiescence) -AutoDelete $Retention -EncryptionKey $EncryptionKey
  }
  
  Else 
  {
    $ZIPSession = Start-VBRZip -Entity $VM -Folder $Directory -Compression $CompressionLevel -DisableQuiesce:(!$EnableQuiescence) -AutoDelete $Retention
  }
  
  If ($EnableNotification) 
  {
    $TaskSessions = $ZIPSession.GetTaskSessions().logger.getlog().updatedrecords
    $FailedSessions =  $TaskSessions | where {$_.status -eq "EWarning" -or $_.Status -eq "EFailed"}
  
  if ($FailedSessions -ne $Null)
  {
    $MesssagyBody = $MesssagyBody + ($ZIPSession | Select-Object @{n="Name";e={($_.name).Substring(0, $_.name.LastIndexOf("("))}} ,@{n="Start Time";e={$_.CreationTime}},@{n="End Time";e={$_.EndTime}},Result,@{n="Details";e={$FailedSessions.Title}})
  }
   
  Else
  {
    $MesssagyBody = $MesssagyBody + ($ZIPSession | Select-Object @{n="Name";e={($_.name).Substring(0, $_.name.LastIndexOf("("))}} ,@{n="Start Time";e={$_.CreationTime}},@{n="End Time";e={$_.EndTime}},Result,@{n="Details";e={($TaskSessions | sort creationtime -Descending | select -first 1).Title}})
  }
  
  }   
}
If ($EnableNotification)
{
$Message = New-Object System.Net.Mail.MailMessage $EmailFrom, $EmailTo
$Message.Subject = $EmailSubject
$Message.IsBodyHTML = $True
$message.Body = $MesssagyBody | ConvertTo-Html -head $style | Out-String
$SMTP = New-Object Net.Mail.SmtpClient($SMTPServer)
$SMTP.Send($Message)
}


Folgende Fehlermeldung erhalte ich:

Start-VBRZip : Das Argument für den Parameter "Entity" kann nicht überprüft werden. Das Argument ist NULL. Geben Sie einen gültigen Wert für das Argument an, und führen Sie den Befehl 
erneut aus.
In C:\Users\Administrator\Desktop\Veeam_Backup.ps1:92 Zeichen:40
+     $ZIPSession = Start-VBRZip -Entity $VM -Folder $Directory -Compression $Comp ...
+                                        ~~~
    + CategoryInfo          : InvalidData: (:) [Start-VBRZip], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationError,Veeam.Backup.PowerShell.Cmdlets.StartVBRZip
 
Es ist nicht möglich, eine Methode für einen Ausdruck aufzurufen, der den NULL hat.
In C:\Users\Administrator\Desktop\Veeam_Backup.ps1:97 Zeichen:5
+     $TaskSessions = $ZIPSession.GetTaskSessions().logger.getlog().updatedrecords
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull
 
Ausnahme beim Aufrufen von "Send" mit 1 Argument(en):  "Fehler beim Senden von Mail."
In C:\Users\Administrator\Desktop\Veeam_Backup.ps1:119 Zeichen:1
+ $SMTP.Send($Message)
+ ~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : SmtpException

 



#12 Dukel

Dukel

    Board Veteran

  • 9.252 Beiträge

 

Geschrieben 13. April 2017 - 07:31

Nutzt du die Freie Veeam Version oder warum musst du per Powershell die VM's zusammensuchen?

Kannst du das Script debuggen (z.B. mit der ISE) und dir anschauen, was in den Variablen steht?


Stop making stupid people famous.


#13 monstermania

monstermania

    Board Veteran

  • 1.178 Beiträge

 

Geschrieben 13. April 2017 - 08:29

 

Kennt sich jemand zufällig mit Veeam Backup & Replication aus und sichert seine VMs damit? Meine Intention war eigentlich das Powershell Skript so anzupassen, dass die vorhandenen VM's automatisch ermittelt werden.

Ja,

wir nutzen hier Veam B&R um unsere VM damit zu sichern.

Aber Scripten (Veeam) mussten wir bisher fast nie. Wir haben die einzelnen VM in Ordnern gruppiert (VMWare). Z.B. Email, Datenbank, Testsysteme, usw.

Die Veeam-Jobs sind auf die Gruppen eingerichtet. Kommt also eine neue VM in die Gruppe Datenbank hinzu wird diese automatisch beim nächsten Veeam-Job für diese Gruppe mitgesichert. 

Läuft Alles ohne Scripten!

 

Gruß

Dirk



#14 BpDk

BpDk

    Newbie

  • 53 Beiträge

 

Geschrieben 13. April 2017 - 11:34

Ja,

wir nutzen hier Veam B&R um unsere VM damit zu sichern.

Aber Scripten (Veeam) mussten wir bisher fast nie. Wir haben die einzelnen VM in Ordnern gruppiert (VMWare). Z.B. Email, Datenbank, Testsysteme, usw.

Die Veeam-Jobs sind auf die Gruppen eingerichtet. Kommt also eine neue VM in die Gruppe Datenbank hinzu wird diese automatisch beim nächsten Veeam-Job für diese Gruppe mitgesichert. 

Läuft Alles ohne Scripten!

 

Gruß

Dirk

Da wir die freie Version nutzen (für uns aktuell vollkommen ausreichend) müssen wir mit Script und Tasks arbeiten um automatisch zu sichern.

 

 

Nutzt du die Freie Veeam Version oder warum musst du per Powershell die VM's zusammensuchen?

Kannst du das Script debuggen (z.B. mit der ISE) und dir anschauen, was in den Variablen steht?

 

Hallo Dukel,

 

die Variable "Ausgabe" enthält alle VM's in der gewünschtgen Syntax ("VM01, "VM02", .....).

 

Quasi wie, wenn ich der Variable feste Werte zuweise.

 

:confused:



#15 Dukel

Dukel

    Board Veteran

  • 9.252 Beiträge

 

Geschrieben 13. April 2017 - 11:36

In der Fehlermeldung wird die Variable "VM" bemängelt und nicht "Ausgabe".


Stop making stupid people famous.




Auch mit einem oder mehreren der folgenden Tags versehen: Hyper-V