Jump to content

Get-VM Parsen ?


Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

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
Link zu diesem Kommentar

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.

Link zu diesem Kommentar

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 ','
Link zu diesem Kommentar

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 '","') + '"'
Link zu diesem Kommentar

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.

Link zu diesem Kommentar

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?

Link zu diesem Kommentar

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.microsoft.com/de-de/library/hh847757.aspx

Link zu diesem Kommentar

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

 

Link zu diesem Kommentar

 

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

Link zu diesem Kommentar

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:

Link zu diesem Kommentar
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...