嗨,我是PowerShell的新手。
我有一个2017文件夹,有12个子文件夹(从1月到12月)。在子文件夹中,还有更多文件夹(例如,Jan将有31个文件夹,2月将有28个文件夹,3月将有31个文件夹,依此类推)。在这些文件夹中将有10个文件。我需要编写一个脚本,其中我必须循环这些文件夹,子文件夹并检查这10个文件是否存在。有人可以指导我吗?
我需要添加以下条件:如果2017文件夹没有12个文件则失败,如果Jan文件夹没有31个文件夹则失败,如果这31个文件夹中的文件不存在则再次失败( 31个文件夹中的每个文件夹中都有10个文件。有关如何实施的任何建议?
如果有任何必要的信息,请告诉我。
谢谢。
答案 0 :(得分:2)
在PowerShell中,符合规范的代码非常简单 - 如果你真的只需要" FAIL"。
虽然最简单的版本(首先显示)并未指出失败位置,但底部有一个简单的增强建议,用于过滤失败的目录:
$BasePath = 'C:\' # Parent of the 2017 directory
# *\*\* --> MONTHS\DAYS\FILES
$totals = dir "$BasePath\2017\*\*\*" -file |
Group-Object directoryname -noElement |
measure count -minimum -maximum -sum
IF ($Totals.Sum -ne 3650 -or $Totals.Maximum -ne 10 -or $Totals.Minimum -ne 10) {
"FAIL"
} else {
"Succeed"
}
$Totals # just show the totals if you wish
搜索路径中的3个星号是三个目录级别的通配符:: MONTH级别,DAY级别和FILES。 2017 ***
许多PowerShell cmdlet允许在多个'目录中使用完整的通配符。路径规范的元素。
最终的文件模式可以更改为" * .log"或者与正确添加的文件匹配的任何内容。
每一天'目录应该有10个文件,2017年每天有365天* 10个文件,所以预计总数为3650(如果需要检查2016年或2020年等,很容易添加闰年检查等)。
如果显示,Group-Object输出(对于我的' C:\ Program Files'目录)如下所示:
Count Name
----- ----
203
12 C:\Program Files\7-Zip
3 C:\Program Files\Appli...
18 C:\Program Files\Beyon...
4 C:\Program Files\Bonjour
20 C:\Program Files\Class...
...
Measure-Object输出(存储在$ Totals中)如下所示:
Count : 41
Average :
Sum : 747
Maximum : 203
Minimum : 1
Property : Count
由于每个目录必须有10个文件,每个目录应该有10个DIRECTORY名称(在GROUP-OBJECT计数中),因此MINIMUM和MAXIMUM必须都是10。
您可以通过使用
过滤Group-Object结果来识别失败的目录| Where-Object Count -ne 10
享受。