Jump to content

Problem mit Script Backup & Cleanup Sharepoint


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

Empfohlene Beiträge

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

Link zu diesem Kommentar

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.

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

@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 ;-)

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

 

 

 

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

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

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.)

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...