Чтобы проверить, все ли файлы существуют в папке, используя powershell

Привет, я новичок в powershell.

У меня есть папка 2017 года, которая имеет 12 подпапок (с января по декабрь). Внутри подпапок есть еще много папок (например, у января будет 31 папка, у февраля 28 папок, у марта 31 папка и т. Д.). Внутри этих папок будет 10 файлов. Мне нужно написать скрипт, в котором я должен выполнить цикл внутри этих папок, подпапок и проверить, присутствуют ли эти 10 файлов. Может кто-нибудь, пожалуйста, направлять меня?

Мне нужно будет добавить условия, такие как: Если в папке 2017 года нет 12 файлов, произойдет сбой, если в папке "Ян" нет 31 папки, произойдет сбой, если файлов в этих 31 папках нет, то снова произойдет сбой (будет 10 файлов внутри каждой из 31 папки). Любые предложения о том, как это можно реализовать?

Пожалуйста, дайте мне знать, если есть какая-либо информация, которая требуется.

Спасибо.

1 ответ

Код для соответствия спецификации довольно прост в 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 допускают полный подстановочный знак в нескольких элементах 'directory' спецификации пути.

  1. Уровень МЕСЯЦ (12 месяцев года)
  2. ДЕНЬ уровень (28-31 в зависимости от месяца)
  3. Уровень файла (должно быть 10 каждый)

Конечный шаблон файла может быть изменен на что-то вроде "*.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...
   ...

Вывод объекта измерения (хранится в $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

Наслаждаться.

Другие вопросы по тегам