我正在尝试编写一个 Powershell 脚本来检查某个文件夹中的 .zip 文件。.zip 文件包含来自某些备份的信息。这些 .zip 文件位于我们公司拥有的不同工厂的文件夹树中。每天,此文件夹树的底部都应该有一个新的 .zip 文件,该文件总共保留 7 天。
理想情况下,每个文件夹应连续7天的备份等于7个文件夹中的7个文件,有时有7个以上的备份。
我想(但遇到了麻烦)编写一个脚本来检查这些文件夹中的 .zip 文件,并让我知道其中是否没有过去 7 天的任何文件。(如果没有正好 7 天也没关系)。
到目前为止我有以下代码:
Get-ChildItem -filter "*.zip" -recurse -path C:\ArcherBackup\ | where {($_.CreationTime -gt ((get-date).AddDays(-7)))}
但是这段代码会列出我必须手动查看的每个文件的列表。
我希望脚本或多或少地突出显示不包含至少 7 天前的 .zip 文件的目录。
任何帮助或指导都将不胜感激。
答案1
您的代码片段将返回过去七天内创建的所有文件。
$_.CreationTime -gt ((get-date).AddDays(-7))
我认为您想要返回超过七天的文件,因此更改-gt
为-lt
:
$_.CreationTime -lt ((get-date).AddDays(-7))
使用比较时,最好总是使用小于运算符,这样,条件增加从左到右,像 x 轴一样,它有助于可读性/理解。
0 -lt x -and x -lt 10
显然 x 应该介于 0 和 10 之间。
答案2
var 1,命令行,不包含至少 7 天前的 .zip 文件的子目录:
powershell $tm=(get-date).AddDays(-7);ls "C:\ArcherBackup" -fo -r^|?{$_.PSIsContainer}^|%{ls "$($_.FullName)" -fo -fi *.zip}^|?{$_.CreationTime -lt $tm}^|group Directory^|FT -H Name
var 2、命令行、不包含至少 7 天前的 .zip 文件的子目录;
除了隐藏文件和目录:
powershell $tm=(get-date).AddDays(-7);ls "C:\ArcherBackup" -r^|?{$_.PSIsContainer}^|%{ls "$($_.FullName)" -fi *.zip}^|?{$_.CreationTime -lt $tm}^|group Directory^|FT -H Name
没有文件的空子文件夹:
powershell $d=ls -r^|?{$_.PSIsContainer};$d^|?{$_.GetFiles().Count -eq 0}^|FT -H FullName
没有 zip 文件的子文件夹:
powershell $d=ls -r^|?{$_.PSIsContainer};$d^|?{$_.GetFiles('*.zip').Count -eq 0}^|FT -H FullName
没有 zip 文件的子文件夹;
不包含至少 7 天前的 .zip 文件的子目录:
powershell $d=ls "C:\ArcherBackup" -fo -r^|?{$_.PSIsContainer};$tm=(get-date).AddDays(-7);$d^|%{ls "$($_.FullName)" -fo -fi *.zip}^|?{$_.CreationTime -lt $tm}^|group Directory^|FT -Au -H Name, Count;$d^|?{$_.GetFiles('*.zip').Count -eq 0}^|FT -H FullName|findstr [/s]| more
|findstr [/s]|
- 删除管道中的空字符串
FT
- 别名Format Table
FT -H FullName
- 输出格式,仅选择FullName
-Au
别名-Autosize
-H
-隐藏标题,
?
- 别名where
- 别名Where-Object
%
- 别名foreach
- 别名ForEach-Object
-fo
- 别名-force
,fi
- 别名-filter
,-r
- 别名-recurse
^
- 转义字符|
- 当前 shell 不作为pipeline
命令处理
group
- 别名Group-Object