Чтобы проверить, все ли файлы существуют в папке, используя 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' спецификации пути.
- Уровень МЕСЯЦ (12 месяцев года)
- ДЕНЬ уровень (28-31 в зависимости от месяца)
- Уровень файла (должно быть 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
Наслаждаться.