我尝试压缩在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文件的文件夹?
答案 0 :(得分:1)
您的Get-ChildItem
行会导致返回大量的项目。无论它们是文件还是文件夹。您将最终得到包含两个对象的对象数组。
在抽象级别上,它看起来像这样:
如果您查看Compress-Archive
的定义,则会发现以下-Path
参数的描述。
指定要添加到归档压缩文件中的文件的路径。此参数可以接受通配符。通配符允许您将文件夹中的所有文件添加到压缩存档文件中。要指定多个路径,并在输出的压缩文件中的多个位置包含文件,请使用逗号分隔路径。
如果将路径交给单个文件,则不会保留路径。这样一来,它就会忠实地压缩Folder\
中的所有内容,并同时添加a.file
和b.file
。
要解决此问题,您可以为Get-ChildItem
指定一个附加过滤器,例如-File
或-Directory
,以仅获取文件或目录。我的猜测是,您只希望文件具有各自的文件夹结构。
要执行此操作,您可以将文件复制到一个临时位置,然后压缩整个临时位置。它只会包含您想要的文件。
答案 1 :(得分:0)
将-File
添加到您的Get-ChildItem
中以仅返回文件:
Get-ChildItem -Path $path -recurse -exclude "$exclude" -File