Как исправить этот сценарий PowerShell, который автоматически удаляет резервные копии Sharepoint - PullRequest
1 голос
/ 07 января 2011

Я использовал этот ( и этот ) сценарий для удаления старых резервных копий на sharepoint, но он удаляет все резервные копии, а не 14+ дневные.

Я запустил его с помощью powershell_ise.exe и установил точку останова под строкой, в которой есть $_.SPStartTime, и он показывает $_.SPStartTime =, как будто дата не заполнена.Я заглянул внутрь $sp.SPBackupRestoreHistory.SPHistoryObject, и в нем содержатся ожидаемые данные.

В этой строке есть проблема:

# Find the old backups in spbrtoc.xml
$old = $sp.SPBackupRestoreHistory.SPHistoryObject |
? { $_.SPStartTime -lt ((get-date).adddays(-$days)) }

Я получаю все выходные данные (которые ябудет ожидать).Это говорит мне о проблеме в 'где' или '?'- Я понимаю, что они взаимозаменяемы.В любом случае $ old всегда имеет значение null.

По запросу:

<?xml version="1.0" encoding="utf-8"?>
<SPBackupRestoreHistory>
    <SPHistoryObject>
        <SPId>a8a03c50-6bc2-4af4-87b3-caf60e750fa0</SPId>
        <SPRequestedBy>ASERVER\AUSER</SPRequestedBy>
        <SPBackupMethod>Full</SPBackupMethod>
        <SPRestoreMethod>None</SPRestoreMethod>
        <SPStartTime>01/09/2011 00:00:13</SPStartTime>
        <SPFinishTime>01/09/2011 00:05:22</SPFinishTime>
        <SPIsBackup>True</SPIsBackup>
        <SPConfigurationOnly>False</SPConfigurationOnly>
        <SPBackupDirectory>E:\Backups\spbr0003\</SPBackupDirectory>
        <SPDirectoryName>spbr0003</SPDirectoryName>
        <SPDirectoryNumber>3</SPDirectoryNumber>
        <SPTopComponent>Farm</SPTopComponent>
        <SPTopComponentId>689d7f0b-4f64-45d4-ac58-7ab225223625</SPTopComponentId>
        <SPWarningCount>0</SPWarningCount>
        <SPErrorCount>0</SPErrorCount>
    </SPHistoryObject>
    <SPHistoryObject>
        <SPId>22dace04-c300-41d0-a9f1-7cfe638809ef</SPId>
        <SPRequestedBy>ASERVER\AUSER</SPRequestedBy>
        <SPBackupMethod>Full</SPBackupMethod>
        <SPRestoreMethod>None</SPRestoreMethod>
        <SPStartTime>01/08/2011 00:00:13</SPStartTime>
        <SPFinishTime>01/08/2011 00:05:26</SPFinishTime>
        <SPIsBackup>True</SPIsBackup>
        <SPConfigurationOnly>False</SPConfigurationOnly>
        <SPBackupDirectory>E:\Backups\spbr0002\</SPBackupDirectory>
        <SPDirectoryName>spbr0002</SPDirectoryName>
        <SPDirectoryNumber>2</SPDirectoryNumber>
        <SPTopComponent>Farm</SPTopComponent>
        <SPTopComponentId>689d7f0b-4f64-45d4-ac58-7ab225223625</SPTopComponentId>
        <SPWarningCount>0</SPWarningCount>
        <SPErrorCount>0</SPErrorCount>
    </SPHistoryObject>
</SPBackupRestoreHistory>

Ответы [ 2 ]

6 голосов
/ 24 января 2011

Я считаю, что проблема была в форматировании даты.

Окончательный рабочий скрипт:

# Location of spbrtoc.xml
$spbrtoc = "E:\Backups\spbrtoc.xml" 

# Days of backup that will be remaining after backup cleanup.
$days = 14

# Import the Sharepoint backup report xml file
[xml]$sp = gc $spbrtoc 

# Find the old backups in spbrtoc.xml
$old = $sp.SPBackupRestoreHistory.SPHistoryObject |
    ? { ( (
             [datetime]::ParseExact($_.SPStartTime, "MM/dd/yyyy HH:mm:ss", [System.Globalization.CultureInfo]::InvariantCulture)
          ) -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} 

# 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 $days days are removed from spbrtoc.xml and harddisc."
5 голосов
/ 07 января 2011

Мне кажется, что вы заканчиваете тем, что сравнение основано на строках, а не на датах, например:

"10/08/2007 20:20:13" -lt (Get-Date -Year 1900)

Число всегда будет меньше, чем "воскресенье" или "понедельник" или что-либо еще, что вы получите в начале строки, когда объект DateTime приведен к строке ...

У меня нет доступа к набору резервных копий, на которых я мог бы это проверить, но для начала вам следует это исправить, и в то же время убедиться, что вы не удаляете резервную копию только потому, что значение нуль:

# Find the old backups in spbrtoc.xml
$old = $sp.SPBackupRestoreHistory.SPHistoryObject |
Where { (Get-Date $_.SPStartTime) -lt ((get-date).adddays(-$days)) }

Формат строки даты в файле XML (в соответствии с страницей документов ) - это формат, который Get-Date может легко проанализировать, поэтому он должен работать без проблем.

Кстати, ваше предположение верно, что $ _ является текущим объектом итерации из массива;)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...