2016-11-07 4 views
0

Ich versuche, alte Dateien im Server (älter als 90 Tage) zu archivieren und es sollte separate ZIP-Datei für jeden Monat sein. Ich habe so kann ich System.Management.Automation.PSObjectProblem mit der Archivierung von Dateien

nicht verwenden Ich habe ein Skript erstellt, aber ich habe ein Problem mit ZIP-Dateinamen. Wenn ich das Skript ausführe, werden alle Dateien in ein Archiv mit dem Namen +++ verschoben.

Es wäre schön, wenn jemand herausfinden könnte, was ich falsch mache.

Antwort

1

Es gibt zwei Probleme, warum dies nicht funktioniert. Zuerst wählen Sie (ForEach-Object cmdlet %) die Eigenschaft FullName aus, so dass Sie nicht mehr auf die -Eigenschaft zugreifen können. Zweitens versuchen Sie die Eigenschaft auf eine mögliche Anordnung von Dateien zuzugreifen (das Jahr und Monat die Sie verwenden möchten?)

So würde ich ändern/Refactoring Ihr Skript so etwas wie dieses (ungetestet).

$folders ="C:\New folder\test\" 

function Write-ZipFile 
{ 
    Param 
    (
     [string]$Path, 
     [string[]]$Files 
    ) 
    $7zip = Join-Path $env:ProgramFiles '\7-zip\7z.exe' 
    & $7zip A -tzip $zipFile $toBeZipped | Out-Null 
} 

$files = Get-ChildItem -Path $folders | 
    Where-Object { $_.LastWriteTime -lt ((Get-date).AddDays(-90)) } 

$zipFile = Join-Path $folders ('{0}{1}.zip' -f $files[0].LastwriteTime.Year, $files[0].LastwriteTime.Month) 

Write-ZipFile -Path $zipFile -Files ($files | select -ExpandProperty FullName) 
1

Die Liste der zu archivierenden Dateinamen befindet sich in $ files. Verwenden Sie $files.GetType() um zu sehen, dass es ein Array ist. Verwenden Sie $files[0].GetType(), um zu sehen, dass jedes Element ein Zeichenfolgentyp und kein Dateiobjekttyp ist.

$ files = Get-ChildItem -Pfad $ Ordner | Where-Objekt {$ _. LastwriteTime -lt (Get-Datum) .adddays (-90)}

Ich stelle mir vor, dass Sie Verzeichnisse weglassen wollen.

Das $ files-Array ist ein Array von FileInfo-Objekten, keine Strings.

Zweitens, etwas tun, um über die Liste der FileInfo Objekte zu iterieren.

[cmdletbinding()] 
Param() 

$folders = "H:\src\powershell\afm" 

Function Zip 
{ 
    Param (
     [string]$zipFile 
     , [string[]]$toBeZipped 
    ) 

    & "C:\Program Files\7-Zip\7z.exe" A -tzip $zipFile $toBeZipped | Out-Null 
} 

$files = Get-ChildItem -Path $folders -File | 
    Where-Object {($_.LastwriteTime -lt (Get-date).adddays(-10)) -and ($_.Extension -ne ".zip")} 

$files | ForEach-Object { 
    Write-Verbose "Working on file $_" 

    $file_year = $_.LastwriteTime.Year 
    $file_month = $_.LastwriteTime.Month 

    Write-Verbose "file_month is $file_month" 

    Zip "$folders\$file_year$file_month.zip" "$folders\$_" 

    If (Test-Path "$folders\$file_year$file_month.zip") 
    { 
     ### Remove-Item $_q 
    } 
} 

Es scheint, dass das Problem ist, dass es nichts gibt, jede Datei zu archivieren, um sie zu archivieren. Es gibt kein ForEach-Objekt.

Es gibt kein LastWriteTime für ein Array-Objekt, nur für ein FileInfo-Objekt.

Verwandte Themen