Powershell在两个日期之间创建ZIP文件

时间:2019-01-30 09:39:52

标签: powershell zip

我尝试压缩在2个日期之间创建的文件。

param(
[String]$path="DieserPfadWirdAlsParameterGesetzt"
)

$exclude=@("*.zip")
$currentYear = (Get-Date).AddYears(-1).ToString("yyyy")

$firstDayOfYear = Get-Date -Day 1 -Month 1 -Year $currentYear -Hour 0 -Minute 0 -Second 0
$lastDayOfYear = Get-Date -Day 31 -Month 12 -Year $currentYear -Hour 23 -Minute 59 -Second 59

$files = Get-ChildItem -Path $path -recurse -exclude "$exclude" |     
    where {
        $_.CreationTime -ge $firstDayOfYear -and             
        $_.CreationTime -lt $lastDayOfYear            
          }

Compress-Archive -Path $files.FullName -DestinationPath "$path\Archiv$currentYear.zip"
Remove-Item $files.FullName -Recurse -Force -Exclude $exclude

该脚本有效,但是... 假设目录C:\Users\...\Test中的文件夹是2018年创建的,而该文件夹中的文件也是2018年创建的。脚本将创建新的zip文件(Archiv2018.zip),但是在该zip文件中将是其中包含文件且仅包含文件的文件夹...

有没有办法只压缩其中包含文件的文件夹,而不压缩仅包含AND文件的文件夹?

2 个答案:

答案 0 :(得分:1)

您的Get-ChildItem行会导致返回大量的项目。无论它们是文件还是文件夹。您将最终得到包含两个对象的对象数组。

在抽象级别上,它看起来像这样:

  • 文件夹\
  • 文件夹\ a.file
  • 文件夹\ b.file

如果您查看Compress-Archive的定义,则会发现以下-Path参数的描述。

  

指定要添加到归档压缩文件中的文件的路径。此参数可以接受通配符。通配符允许您将文件夹中的所有文件添加到压缩存档文件中。要指定多个路径,并在输出的压缩文件中的多个位置包含文件,请使用逗号分隔路径。

如果将路径交给单个文件,则不会保留路径。这样一来,它就会忠实地压缩Folder\中的所有内容,并同时添加a.fileb.file

要解决此问题,您可以为Get-ChildItem指定一个附加过滤器,例如-File-Directory,以仅获取文件或目录。我的猜测是,您只希望文件具有各自的文件夹结构。

要执行此操作,您可以将文件复制到一个临时位置,然后压缩整个临时位置。它只会包含您想要的文件。

答案 1 :(得分:0)

-File添加到您的Get-ChildItem中以仅返回文件:

Get-ChildItem -Path $path -recurse -exclude "$exclude" -File