Marco31 33 Geschrieben 29. Januar 2020 Melden Teilen Geschrieben 29. Januar 2020 (bearbeitet) Hallo liebe PowerShell-Kundige, ich möchte mit dem PowerShell-Script von http://sharepoint4newbie.blogspot.com/2011/02/sharepoint-farm-backup-and-cleanup.html meine Sharepoint-Farm sichern und die Sicherungen aufräumen. Es gibt da aber ein kleines Problem mit dem Script - führe ich es aus, bekomme ich den Fehler "Der Parameter "Date" kann nicht gebunden werden. Der Wert "01/29/2020 08:54:02" kann nicht in den Typ "System.DateTime" konvertiert werden. Fehler: "Die Zeichenfolge wurde nicht als gültiges DateTime erkannt."." Ich vermute mal es hat mit dem Datumsformat zu tun da das System auf Deutsch installiert wurde. Leider bin ich aber in PowerShell nicht wirklich bewandert, daher möchte ich um Hilfe bitten um das Script so anzupassen, dass das Script das Datum verarbeiten kann. Hier noch mal das Script: ##==================================================================## ## PowerShell SharePoint 2010 Farm Backup, Cleanup and Email Script ## ## Version: 2.0 ## ## Last updated: 04 Jan, 2012 ## ## Description: This script will perform the following ## ## 1) Backup Site Collection ## ## 2) Backup SharePoint Farm ## ## 3) Cleanup old backup and old farm backup ## ## 4) Log deleted file in cleanup.log ## ## 5) Send out status email ## ##==================================================================## $snapin = Get-PSSnapIn -name "Microsoft.SharePoint.PowerShell" -registered if(!$snapin) { Add-PSSnapIn Microsoft.SharePoint.PowerShell } $today = (Get-Date -Format yyyy-MM-dd) $collectionBackupPath ="\\SP2010\E$\Scheduled_Backups\Site-80\" $farmBackupPath = "\\SP2010\E$\Scheduled_Backups\Farm\" $webSite = "http://SP2010" ##Cleanup Backup that is older then x day. $days = 7 ##Variables for Email $emailFrom = "SP2010@SharePoint4Newbie.com" $emailTo = "administrator@SharePoint4Newbie.com" $smtpServer = "MailServer.SharePoint4Newbie.com" ## Send Mail Function Function sendEmail { param($from,$to,$subject,$smtphost,$body) $smtp= New-Object System.Net.Mail.SmtpClient $smtphost $msg = New-Object System.Net.Mail.MailMessage $from, $to, $subject, $body #$msg.isBodyhtml = $true $smtp.send($msg) } Try { $backupFile = $collectionBackupPath + $today + ".Bak" ## Backing up SharePoint Collection Backup-SPSite -Identity $webSite -Path $backupFile -Force -ea Stop ## Backing up SharePoint Farm Backup-SPFarm -directory $farmBackupPath -backupmethod Full ## Location of spbrtoc.xml $spbrtoc = $farmBackupPath + "spbrtoc.xml" ## Import the Sharepoint backup report xml file [xml]$sp = gc $spbrtoc ## Find the old backups in spbrtoc.xml $old = $sp.SPBackupRestoreHistory.SPHistoryObject | Where { (Get-Date $_.SPStartTime) -lt ((get-date).adddays(-$days)) } if ($old -eq $Null) { write-host "No reports of backups older than " + $days + " days found in spbrtoc.xml.`nspbrtoc.xml isn't changed and no files are removed.`n" ; break} if ($old -eq $Null) { Add-Content $farmBackupPath"cleanup.log" "$date - Farm BK Script - No reports of backups older than $days days found in spbrtoc.xml. spbrtoc.xml isn't changed and no files are removed.`n"; } else { ## Delete the old backups from the Sharepoint backup report xml file $old | % { $sp.SPBackupRestoreHistory.RemoveChild($_) } ## Delete the physical folders in which the old backups were located $old | % { Remove-Item $_.SPBackupDirectory -Recurse } ## Save the new Sharepoint backup report xml file $sp.Save($spbrtoc) ##Write-host "Backup(s) entries older than " + $portalRecycleDays + " days are removed from spbrtoc.xml and harddisc." Add-Content $farmBackupPath"cleanup.log" "$date - Farm BK Script - Backup(s) entries older than $portalRecycleDays days are removed from spbrtoc.xml and harddisc."; } ## Remove Previous Site Collection Backup $LastWrite = [DateTime]::Now.AddDays(-$days) $Files = get-childitem $collectionBackupPath"*.bak" | Where {$_.LastWriteTime -le "$LastWrite"} if (!$Files) { Add-Content $collectionBackupPath"cleanup.log" "$date - Farm BK Script - No backup file is older than $LastWrite "; } else { foreach ($File in $Files) { ##Deleting old backup file Remove-Item $File -Force Add-Content $collectionBackupPath"cleanup.log" "$date - Farm BK Script - Deleted file $File ..."; } } ## Composed a status update email for administration $emailSubject = "SharePoint Farm Backup is completed" $emailBody = "SharePoint Farm Backup is completed successfully on "+ $today + "`r`n`r`nFarm backup can be found at $webSite:9999/_admin/BackupHistory.aspx`r`n`r`nBackup files are located at $collectionBackupPath"; sendEmail $emailFrom $emailTo $emailSubject $smtpServer $emailBody } Catch { ## Composed a status update email for administration $ErrorMessage = $_.Exception.Message $emailSubject = "SharePoint Farm Backup Job failed on "+$today $emailBody = "SharePoint Farm Backup Job failed on "+ $today + "`r`n`r`nThe reason of the failure was: $ErrorMessage." sendEmail $emailFrom $emailTo $emailSubject $smtpServer $emailBody } Finally { ## Unlock the site Set-SPSite -Identity $webSite -LockState "Unlock" } ##==================================================================## bearbeitet 29. Januar 2020 von Marco31 Zitieren Link zu diesem Kommentar
BOfH_666 577 Geschrieben 29. Januar 2020 Melden Teilen Geschrieben 29. Januar 2020 vor 10 Minuten schrieb Marco31: Ich vermute mal es hat mit dem Datumsformat zu tun da das System auf Deutsch installiert wurde. Leider bin ich aber in PowerShell nicht wirklich bewandert, daher möchte ich um Hilfe bitten um das Script so anzupassen, dass das Script das Datum verarbeiten kann. Ohne jetzt den nicht als Code formatierten Code durchzuackern - benutz doch dann einfach ein "Deutsches" Datum-Zeit-Format - also "29.01.2020 08:54:02" Zitieren Link zu diesem Kommentar
Marco31 33 Geschrieben 29. Januar 2020 Autor Melden Teilen Geschrieben 29. Januar 2020 Sorry, das mit dem Code formatieren zu spät gelesen.... Wurde geändert! vor 38 Minuten schrieb BOfH_666: Ohne jetzt den nicht als Code formatierten Code durchzuackern - benutz doch dann einfach ein "Deutsches" Datum-Zeit-Format - also "29.01.2020 08:54:02" Die Frage ist da nur wo... Wenn ich $today = (Get-Date -Format yyyy-MM-dd) auf dd-MM-yyyy umstellen kommt der gleiche Fehler. Zitieren Link zu diesem Kommentar
MurdocX 949 Geschrieben 29. Januar 2020 Melden Teilen Geschrieben 29. Januar 2020 (bearbeitet) if ($old -eq $Null) { write-host "No reports of backups older than " + $days + " days found in spbrtoc.xml.`nspbrtoc.xml isn't changed and no files are removed.`n" break } if ($old -eq $Null) ..... Diese Zeilen geben keinen Sinn, denn wenn $old = $null dann wird das Skript durch break abgebrochen und beendet. Damit wäre die zweite Abfrage unsinnig, denn sie wird nie aufgerufen. Falls 2 das break wäre falsch, dann kann man die zwei if - Abfragen zu einer formulieren. In Beiden Fällen gibt es Verbesserungspotential vor einer Stunde schrieb Marco31: if ($old -eq $Null) { Add-Content $farmBackupPath"cleanup.log" "$date - Farm BK Script - No reports of backups older than $days days found in spbrtoc.xml. spbrtoc.xml isn't changed and no files are removed.`n"; } Hier wird die Variable $date aufgerufen, bevor ihr ein Wert zugewiesen wurde. Dort kann nie etwas drin stehen. vor einer Stunde schrieb Marco31: ##Write-host "Backup(s) entries older than " + $portalRecycleDays + " days are removed from spbrtoc.xml and harddisc." Add-Content $farmBackupPath"cleanup.log" "$date - Farm BK Script - Backup(s) entries older than $portalRecycleDays days are removed from spbrtoc.xml and harddisc." Hier das Gleiche. Die Variable $date und $portalRecycleDays wurde vorher nicht definiert. Können also nie einen Wert enthalten. $sp = gc $spbrtoc $old = $sp.SPBackupRestoreHistory.SPHistoryObject | Where { (Get-Date $_.SPStartTime) -lt ((get-date).adddays(-$days)) } Ich vermute den Fehler in der XML-Datei, denn dort wird eine Startzeit verarbeitet. Lösche doch mal die Uhrzeit aus der XML-Datei und probiere es neu. Alternative zum Probieren (ich hab es nicht getestet) Where { (Get-Date $_.SPStartTime) ändern zu: Where-Object -FilterScript { (([Datetime]::Parse($_.SPStartTime)).ToShortDateString()) EDIT: Eine Anmerkung sei mir noch erlaubt. Das Backup wird auf dem gleichen Server gesichert, auf dem sich auch der SharePoint befindet. Im Falle eines Serverausfalls ist das die denkbar schlechteste Option bearbeitet 29. Januar 2020 von MurdocX Zitieren Link zu diesem Kommentar
Marco31 33 Geschrieben 29. Januar 2020 Autor Melden Teilen Geschrieben 29. Januar 2020 @MurdocX: Habe die von dir im letzten Teil vorgeschlagene Änderung durchgeführt, bringt jetzt folgenden Fehler: The reason of the failure was: Ausnahme beim Aufrufen von "Parse" mit 1 Argument(en): "Die Zeichenfolge wurde nicht als gültiges DateTime erkannt.". Keine Angst, ich sichere NICHT auf den gleichen Server. Ich habe nur das Script in der Originalform ohne Namen/Pfadanpassungen gepostet Zitieren Link zu diesem Kommentar
MurdocX 949 Geschrieben 29. Januar 2020 Melden Teilen Geschrieben 29. Januar 2020 ## Find the old backups in spbrtoc.xml $old = $sp.SPBackupRestoreHistory.SPHistoryObject | Where-Object -FilterScript { $StartTime = $_ | Select-Object -ExpandProperty 'SPStartTime' $StartTimeDate = [datetime]::Parse($StartTime) $SevenDaysAgo = (Get-Date).adddays(-$days) $StartTimeDate -lt $SevenDaysAgo } Das hier wäre ein Vorschlag. Leider kenne ich nur die Werte die von MS vorgegeben wurden. https://docs.microsoft.com/en-us/previous-versions/office/developer/sharepoint-2010/ms414604(v%3Doffice.14) Wenn hier natürlich keine Werte oder Fehlerhafte vorhanden sind, muss das von Dir kontrolliert werden. Zitieren Link zu diesem Kommentar
Marco31 33 Geschrieben 29. Januar 2020 Autor Melden Teilen Geschrieben 29. Januar 2020 vor 4 Stunden schrieb MurdocX: ## Find the old backups in spbrtoc.xml $old = $sp.SPBackupRestoreHistory.SPHistoryObject | Where-Object -FilterScript { $StartTime = $_ | Select-Object -ExpandProperty 'SPStartTime' $StartTimeDate = [datetime]::Parse($StartTime) $SevenDaysAgo = (Get-Date).adddays(-$days) $StartTimeDate -lt $SevenDaysAgo } Das hier wäre ein Vorschlag. Leider kenne ich nur die Werte die von MS vorgegeben wurden. https://docs.microsoft.com/en-us/previous-versions/office/developer/sharepoint-2010/ms414604(v%3Doffice.14) Wenn hier natürlich keine Werte oder Fehlerhafte vorhanden sind, muss das von Dir kontrolliert werden. Leider war auch das nicht erfolgreich. Ich habe aber eines herausgefunden: in der spbrtoc.xml wird die StartTime im Format MM/dd/yyyy HH:MM:SS (01/29/2020 15:34:00) gespeichert. Ändere ich in der XML die Starttime in dd/MM/yyyy HH:MM:SS (29/01/2020 15:34:00), dann löscht das Script wie gewünscht die Backups. Es dürfte also daran liegen, dass das Script aus der spbrtoc.xml ein Datum im US Format erhält, das ganze aber als deutsches Format verarbeiten möchte. Oder unterliege ich da jetzt einem Denkfehler? Leider reichen meine PS-Kenntnisse nicht mal annähernd für die Änderung des Scripts :-( Zitieren Link zu diesem Kommentar
MurdocX 949 Geschrieben 29. Januar 2020 Melden Teilen Geschrieben 29. Januar 2020 (bearbeitet) vor 6 Stunden schrieb MurdocX: Ich vermute den Fehler in der XML-Datei, denn dort wird eine Startzeit verarbeitet. Lösche doch mal die Uhrzeit aus der XML-Datei und probiere es neu. vor 33 Minuten schrieb Marco31: Ändere ich in der XML die Starttime in dd/MM/yyyy HH:MM:SS (29/01/2020 15:34:00), dann löscht das Script wie gewünscht die Backups. Tatsächlich nimmt Windows nur das Format der jeweiligen Sprache an. Auch die amerikanischen Beispiele funktionieren bei mir nicht. Hier sollte eine Konvertierung in ein deutsches Format vorher erfolgen. EDIT: Interessant war hier der Punkt die Sprache beim Parsen mit einzubinden. Hab ich vorher auch noch nie gemacht. ## Find the old backups in spbrtoc.xml $old = $sp.SPBackupRestoreHistory.SPHistoryObject | Where-Object -FilterScript { $UsCulture = [cultureinfo]::GetCultureInfo('en-US') $StartTime = $_ | Select-Object -ExpandProperty 'SPStartTime' $StartTimeDate = [datetime]::Parse($StartTime,$UsCulture) $SevenDaysAgo = (Get-Date).adddays(-$days) $StartTimeDate -lt $SevenDaysAgo } bearbeitet 29. Januar 2020 von MurdocX Zitieren Link zu diesem Kommentar
Marco31 33 Geschrieben 30. Januar 2020 Autor Melden Teilen Geschrieben 30. Januar 2020 Ok, der alte Fehler ist weg, zwei neue tauchen auf Jetzt kommt "The reason of the failure was: Die Benennung "" wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei oder eines ausführbaren Programms erkannt. Überprüfen Sie die Schreibweise des Namens, oder ob der Pfad korrekt ist (sofern enthalten), und wiederholen Sie den Vorgang.." Und das Script scheint in eine Endlosschleife zu laufen (...was ziemlich b***d war, da meine SharePoint Site Collection auf schreibgeschützt war und sich weder über GUI noch PowerShell wieder aktvieren ließ - konnte ich aber beheben, andere Geschichte.) Zitieren Link zu diesem Kommentar
MurdocX 949 Geschrieben 30. Januar 2020 Melden Teilen Geschrieben 30. Januar 2020 Wie du hier siehst und ich auch schon oben erwähnt habe, ist das Skript schlecht geschrieben. Ich bin mir sicher das ist nicht das einzige Skript zum Sichern von SharePoints und möchte Dir raten ein Anderes zu suchen. Zitieren Link zu diesem Kommentar
Marco31 33 Geschrieben 30. Januar 2020 Autor Melden Teilen Geschrieben 30. Januar 2020 Da scheinst du wohl recht zu haben. Mal schauen was sich noch so findet. Aber auf jeden Fall schon mal vielen Dank für deine Mühe!!! Zitieren Link zu diesem Kommentar
MurdocX 949 Geschrieben 30. Januar 2020 Melden Teilen Geschrieben 30. Januar 2020 Das Skript bezieht sich auf diesen Artikel: https://docs.microsoft.com/de-de/sharepoint/administration/back-up-a-farm Das Wesentliche sind folgende Befehle: Add-SPShellAdmin Backup-SPFarm -Directory <BackupFolder> -BackupMethod {Full | Differential} [-Verbose] Zitieren Link zu diesem Kommentar
Empfohlene Beiträge
Schreibe einen Kommentar
Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.