Es gab vom Backup-Team eine Anforderung, den DeDup-Speicher aufzuräumen, sofern der freie Speicher auf dessen Partition unter 10% sinkt.
Das folgende Skript kümmert sich um genau dieses Thema. Aber Vorsicht! Es kann durchhaus über einen Tag dauern bis es durch ist, je nach Größe des Speichers, Geschwindigkeit der Platten, etc… Darum am besten nicht automatisch laufen lassen, sondern händisch nach Bedarf ausführen.
Warum manche Anweisungen so sind wie sie sind, kann ich nicht sagen, hier habe ich mich voll und ganz auf die Anweisungen des Backup-Teams verlassen:
# Eine Funktion die mir den freien Plattenplatz in Prozent für das Laufwerk D zurückgibt.
# Auf D war der B2D- und DeDup Store und muss ggf. angepasst werden
function DiskSpaceD(){
$Disk = Get-WmiObject Win32_LogicalDisk -Filter "DeviceID='D:'" | Select-Object Size,FreeSpace
$FreeDiskSpaceProzent = $Disk.FreeSpace / $Disk.Size * 100
return $FreeDiskSpaceProzent
}
# Datum und LogFile definieren
$Datum = (Get-Date).ToString("yyyyMMdd_HHmmss")
$LogFile = "C:\Skripte\Logs\DeDup-CleanUp_$Datum.log"
# Prozent freuen Speicher auslesen
$DiskSpace = DiskSpaceD
# Wenn es weniger als 10% freier Speicher ist
if ([int]$DiskSpace -lt 10){
# Da das Skript lokal auf dem BE-Server läuft, ist der Hostname "hostname"
$hostname = Hostname
$MailFrom = "$hostname@domain.de"
$MailTo = "rcpt@domain.de"
$MailSubject = "Backup Exec: CompactStart gestartet"
$MailSMTPServer = "192.168.0.100"
# Funktion die ProcessQueue 2 Mal startet
function 2xProcessqueue(){
& 'C:\Program Files\Symantec\Backup Exec\crcontrol.exe' --processqueue
sleep(5)
& 'C:\Program Files\Symantec\Backup Exec\crcontrol.exe' --processqueue
sleep(5)
# Solange er läuft und nicht beides auf "no" steht, wird weitergemacht
while (1){
$query = & 'C:\Program Files\Symantec\Backup Exec\crcontrol.exe' --processqueueinfo
$busystate = $query[0] -Replace "Busy : "
$pendingstate = $query[1] -Replace "Pending: "
(Get-Date) | Out-File $LogFile -Append
echo $query | Out-File $LogFile -Append
echo "" | Out-File $LogFile -Append
if (($busystate -eq "no") -and ($pendingstate -eq "no")){
(Get-Date) | Out-File $LogFile -Append
echo "Beides wieder auf NO" | Out-File $LogFile -Append
break;
}
sleep(60)
}
}
# Funktion die CRCollect einmal startet
function 1xCRCollect(){
Start-Process "C:\Program Files\Symantec\Backup Exec\crcollect.exe" -ArgumentList "-v -m +1,+2" -NoNewWindow -Wait
sleep(5)
}
# Funktion die CompactStart einmal startet
function 1xCompactStart(){
Start-Process "C:\Program Files\Symantec\Backup Exec\crcontrol.exe" -ArgumentList "--compactstart" -NoNewWindow -Wait
sleep(5)
# Solange er läuft und er nicht auf "no" steht, wird weitergemacht
while (1){
$query = & 'C:\Program Files\Symantec\Backup Exec\crcontrol.exe' --compactstate
$state = ($query[1] -split ": ")[1]
(Get-Date) | Out-File $LogFile -Append
echo $query[1] | Out-File $LogFile -Append
echo "" | Out-File $LogFile -Append
if ($state -eq "No"){
(Get-Date) | Out-File $LogFile -Append
echo "Fertig!" | Out-File $LogFile -Append
break;
}
sleep(60)
}
}
# Mail-Log zusammenbauen und Live-Log schreiben
$Mail = @()
echo "DeDupe Bereinigungs-Script gestartet." | Out-File $LogFile -Append
$Mail += "DeDupe Bereinigungs-Script gestartet."
(Get-Date) | Out-File $LogFile -Append
$Mail += (Get-Date)
$Mail += ""
# Freien Plattenplatz vor dem Start auslesen:
echo "Plattenplatz vor Reinigung:" | Out-File $LogFile -Append
$Mail += "Plattenplatz vor Reinigung:"
$PlattenplatzVorStart = DiskSpaceD
echo "$PlattenplatzVorStart Prozent freier Speicher." | Out-File $LogFile -Append
$Mail += "$PlattenplatzVorStart Prozent freier Speicher."
$Mail += ""
##############################################################################################
# Folgende Anforderung kam vom Backup-Team
# WARUM es mehrere Durchläufe für die ProcessQueue, etc. geben musste, kann ich nicht sagen.
##############################################################################################
# Erster Durchlauf
echo "Erster Durchlauf:" | Out-File $LogFile -Append
$Mail += "Erster Durchlauf gestartet um:"
$Mail += (Get-Date)
2xProcessqueue
$Mail += "Erster Durchlauf beendet um:"
$Mail += (Get-Date)
$Mail += ""
# Zweiter Durchlauf
echo "Zweiter Durchlauf:" | Out-File $LogFile -Append
$Mail += "Zweiter Durchlauf gestartet um:"
$Mail += (Get-Date)
2xProcessqueue
$Mail += "Zweiter Durchlauf beendet um:"
$Mail += (Get-Date)
$Mail += ""
# Einmal CR-Collect
echo "Einmal CR-Collect:" | Out-File $LogFile -Append
$Mail += "CR-Collect gestartet um:"
$Mail += (Get-Date)
1xCRCollect
$Mail += "CR-Collect beendet um:"
$Mail += (Get-Date)
$Mail += ""
# Dritter Durchlauf
echo "Dritter Durchlauf:" | Out-File $LogFile -Append
$Mail += "Dritter Durchlauf gestartet um:"
$Mail += (Get-Date)
2xProcessqueue
$Mail += "Dritter Durchlauf beendet um:"
$Mail += (Get-Date)
$Mail += ""
# Vierter Durchlauf
echo "Vierter Durchlauf:" | Out-File $LogFile -Append
$Mail += "Vierter Durchlauf gestartet um:"
$Mail += (Get-Date)
2xProcessqueue
$Mail += "Vierter Durchlauf beendet um:"
$Mail += (Get-Date)
$Mail += ""
# CompactStart
echo "CompactStart:" | Out-File $LogFile -Append
$Mail += "CompactStart gestartet um:"
$Mail += (Get-Date)
1xCompactStart
$Mail += "CompactStart beendet um:"
$Mail += (Get-Date)
$Mail += ""
# Freien Plattenplatz Beendigung auslesen:
$Mail += "Plattenplatz nach Reinigung:"
$PlattenplatzNachStart = DiskSpaceD
$Mail += "$PlattenplatzNachStart Prozent freier Speicher."
echo "Plattenplatz nach Reinigung:" | Out-File $LogFile -Append
echo "$PlattenplatzNachStart Prozent freier Speicher." | Out-File $LogFile -Append
$MailBody = $Mail | Out-String
$MailBody | Out-File $LogFile -Append
# E-Mail schicken
Send-MailMessage -From $MailFrom -To $MailTo -Subject $MailSubject -Body $MailBody -SmtpServer $MailSMTPServer
# Der Plattenplatz ist ok, es muss nichts gemacht werden
}else{
echo "Plattenplatz bei $DiskSpace Prozent freiem Speicher." | Out-File $LogFile -Append
}