我编写了一个小脚本来搜索我的一台服务器上的所有文件夹,找到3年以上的所有文件。
然而,我当时想要将符合条件的所有文件写入同名档案中,并且我有点担心如何实现。
到目前为止,这是我的代码......
$limit = (Get-Date).AddYears(-3)
$Path = "L:\"
$Path2 = "archive.zip"
$PathB = Get-ChildItem -Path $Path -Recurse -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $Limit }
Compress-Archive -Path $Pathb -DestinationPath {$Path + $Path2}
我想要实现的基本上是什么;
在
目录中> l:\
有3个文件超过3年......
Red.PDF Hello.Doc Me.JPG
我想将这三个文件添加到存档文件中;
L:\Archive-ddmmyyyy.zip
在理想的世界中,已归档的所有这些文件的名称将被写入/附加到L:\标题为archivedlog.csv的csv文件中,列出文件名及其创建日期和它存档的日期。
最终循环将删除原始的三个文件并保留存档。最后一部分我认为我可以实现其他元素而不是那么多。
我到目前为止所找到的是老化的文件,但是在压缩时就说明了“路径' Red.PDF'要么不存在,要么不是有效的系统文件路径。
然而,这可能是因为服务器上的文件格式错误,所保存文件的数量实际上是......格式...
' P Simpson夫人的信12.07.2012.docx要么不存在,要么不是有效的文件系统路径。'
猜测由于重复'。'在文件名中,这可能会导致问题,但我对一个人没有任何线索......
任何人都可以指出我正确的方向吗?
我应该说,目的是通过L:\递归每个目录,为每个属于该类别的子目录中的所有文件生成一个存档。
亲切的问候
[R
答案 0 :(得分:1)
替换
Compress-Archive -Path $Pathb -DestinationPath {$Path + $Path2}
使用
Compress-Archive -Path $PathB.FullName -DestinationPath {$Path + $Path2}
否则Compress-Archive
将期望该文件位于同一目录中。
编辑如果您希望使用包含奇怪字符的文件名,请查看-LiteralPath
路径切换。 .
虽然很好。
答案 1 :(得分:0)
非常感谢gms0ulman,你的帮助让我走上了正确的轨道...... 我正在分享我最终想出的,如果它将来会帮助任何人,
## Sets the time scale in years for files older than that we want to delete.
$limit = (Get-Date).AddYears(-3)
## Sets the starting path for the process
$Path = "L:\"
## Sets the save file name
$Path2 = "archive + $(get-date -f dd-MM-yyyy).zip"
## Sets the archive logfile location
$write = "l:\archivelog-donotremove.csv"
## Runs through each file to identify files in scope and writes to object
$PathB = Get-ChildItem -Path $Path -Recurse -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $Limit }
## Adds all objects to zip file
Compress-Archive -Path $Pathb.FullName -DestinationPath "$Path + $Path2" -Force
## Appends all data to the log file that has been archived
$PathB | export-csv -Append -Path $write -NoTypeInformation -Force
## Deletes all non compressed files that were identified
$Removal = Get-ChildItem -Path $Pathb.FullName -Recurse -Force | Where-Object { !$_.PSIsContainer -and $_.CreationTime -lt $Limit } | foreach { $_.Delete()}