2016-11-07 6 views
0

古いファイルをサーバーにアーカイブしようとしています(古いものから90日後)、毎月別々のZIPファイルにする必要があります。私はを持っていますので、私は使用できませんSystem.Management.Automation.PSObjectアーカイブファイルに関する問題

私はスクリプトを作成しましたが、zipファイル名に問題があります。スクリプトを実行すると、すべてのファイルが名前+++という1つのアーカイブに移動しています。

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

Function Zip 
{ 
       Param 
       (
           [string]$zipFile 
           , 
           [string[]]$toBeZipped 
       ) 
       $CurDir = Get-Location 
       Set-Location "C:\program files\7-zip\" 
       .\7z.exe A -tzip $zipFile $toBeZipped | Out-Null 
       Set-Location $CurDir 
} 

$files = Get-ChildItem -Path $folders | Where-Object {$_.LastwriteTime -lt ((Get-date).adddays(-90))} | % { $_.FullName}; 


if (!$files) 

{break} 

else 
{ 

Write-Host $files 

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


echo $file_month 

    ZIP $folders+"$file_year"+"$file_month"+".zip" $files 



If(Test-Path $folders+$file_year+$file_month+.zip) 
{ 
       Remove-Item $files 
}} 

私が間違っていることを誰かが理解できればいいと思います。

答えて

1

これは動作しない2つの問題があります。まず、ForEach-Objectコマンドレット%を使用してFullNameプロパティを選択すると、LastWriteTimeプロパティにアクセスできなくなります。第二に、潜在的なファイルの配列にアクセスしようとしています(使用する年と月)

このようにスクリプトを変更/リファクタリングします

$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

アーカイブするファイル名のリストは、$ファイルにあります。それが配列であることを確認するには、$files.GetType()を使用してください。 $files[0].GetType()を使用すると、各要素がファイルオブジェクト型ではなく文字列型であることがわかります。

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

ディレクトリを省略したいと思います。

$ files配列は、文字列ではなくFileInfoオブジェクトの配列になります。

第2に、FileInfoオブジェクトのリストに対して何かを反復処理します。

[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 
    } 
} 

問題は、各ファイルをアーカイブするために処理する必要がないということです。 ForEach-Objectはありません。

配列オブジェクトにはLastWriteTimeはなく、FileInfoオブジェクトにのみ存在します。