使用powershell检查文件夹中是否存在所有文件

时间:2018-04-18 10:43:02

标签: powershell organization

嗨,我是PowerShell的新手。

我有一个2017文件夹,有12个子文件夹(从1月到12月)。在子文件夹中,还有更多文件夹(例如,Jan将有31个文件夹,2月将有28个文件夹,3月将有31个文件夹,依此类推)。在这些文件夹中将有10个文件。我需要编写一个脚本,其中我必须循环这些文件夹,子文件夹并检查这10个文件是否存在。有人可以指导我吗?

我需要添加以下条件:如果2017文件夹没有12个文件则失败,如果Jan文件夹没有31个文件夹则失败,如果这31个文件夹中的文件不存在则再次失败( 31个文件夹中的每个文件夹中都有10个文件。有关如何实施的任何建议?

如果有任何必要的信息,请告诉我。

谢谢。

1 个答案:

答案 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允许在多个'目录中使用完整的通配符。路径规范的元素。

  1. 月度水平(一年中的12个月)
  2. 日级(28-31取决于月份)
  3. 文件级别(每个应为10个)
  4. 最终的文件模式可以更改为" * .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
    

    享受。