2016-11-07 63 views
0

我想存档服务器中的旧文件(大于90天),它应该是每个月单独的ZIP文件。我有所以我不能使用System.Management.Automation.PSObject存档文件问题

我已经创建了一个脚本,但我有一个zip文件名的问题。当我运行脚本时,所有文件都将移至名为+++的一个存档。

$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

有两个问题,为什么这不起作用。首先,您正在选择(使用ForEach-Object cmdlet %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中。使用$files.GetType()来查看它是一个数组。使用$files[0].GetType()来查看每个元素是一个字符串类型,而不是文件对象类型。

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

我想你会想要省略目录。

$ files数组将是一个FileInfo对象的数组,而不是字符串。

其次,做一些迭代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对象上。