Jump to content
Melde dich an, um diesen Inhalt zu abonnieren  
BpDk

Get-VM Parsen ?

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

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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

  • Like 1

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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 ','

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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 '","') + '"'
  • Like 2

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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?

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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

 

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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?

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

 

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

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

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:

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte überlege Dir, ob es nicht sinnvoller ist ein neues Thema zu erstellen.

Erstelle ein Benutzerkonto oder melde dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde dich hier an.

Jetzt anmelden
Melde dich an, um diesen Inhalt zu abonnieren  

×