存档文件的问题

时间:2016-11-07 14:12:45

标签: powershell zip powershell-v1.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
}}

如果有人能弄清楚我做错了什么,那就太好了。

2 个答案:

答案 0 :(得分: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 :(得分: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对象上。

相关问题