Я пытаюсь написать сценарий PS для поиска пустых каталогов в каталоге, указанном параметром. «Пустые каталоги» не должны содержать никаких файлов и подкаталогов.
Это сценарий:
param (
[parameter (mandatory=$true,position=0)]
[string]$Path
)
$dirInfo = get-childitem $Path -recurse | ? {$_.PSIsContainer -eq $True} | % {get-childitem $_} | Measure-Object
$dirInfo | ? {$dirInfo.count -eq 0} | Select-Object Fullname
Когда я запускаю его в папке "C:\documents", я получаю следующую ошибку:
**get-childitem : Cannot find path 'C:\Documents\ManualScripts\accounts' because it does not exist.
At C:\Documents\ManualScripts\Check-no-file-and-subdir-dir.ps1:5 char:79
+ $dirInfo = get-childitem $Path -recurse | ? {$_.PSIsContainer -eq $True} | % {ge ...
+ ~~
+ CategoryInfo : ObjectNotFound: (C:\Documents\ManualScripts\accounts:String) [Get-ChildItem], ItemNotFoundException
+ FullyQualifiedErrorId : PathNotFound,Microsoft.PowerShell.Commands.GetChildItemCommand**
И очень много подобных ошибок для каждой из подпапок C:\documents. Он добавляет каталог, в котором находится сам сценарий (C:\Documents\ManualScripts), к имени подкаталога.
Провел исследование и до сих пор не могу понять. Любой вклад приветствуется. Спасибо:)
После вышеприведенного поста я внес некоторые изменения в скрипт, но пока он не работает:
param (
[parameter (mandatory=$true,position=0)]
[string]$Path
)
$Dirs = Get-ChildItem $Path -recurse | ? {$_.PSIsContainer -eq $True} | ForEach-Object -Process {$_.FullName} #get list of all directories with whole path
foreach ($Dir in $Dirs) {
$emptyDir = Get-ChildItem $Dir | Measure | where {$_.Count -eq 0} | select-Object
}
Перед сном я считаю, что немного продвинулся вперед. А скрипт сейчас выглядит так:
param (
[parameter (mandatory=$true,position=0)]
[string]$Path
)
$Dirs = Get-ChildItem $Path -recurse | ? {$_.PSIsContainer -eq $True} | ForEach-Object -Process {$_.FullName} #get list of all directories with whole path
#$Dirs | ForEach-Object {Get-ChildItem $_} | ForEach-Object {measure} | where {$_.Count -eq 0} | Select-Object $Dirs
ForEach ($Dir in $Dirs) {
$emptyDir = Get-ChildItem $Dir | Measure | where {$_.Count -eq 0} | Select-Object
$emptyDir
}
Если я запускаю, на выходе что-то есть (хотя это не то, что я ожидаю)
PS C:\Documents\ManualScripts> .\Check-no-file-and-subdir-dir-rev01.ps1
cmdlet Check-no-file-and-subdir-dir-rev01.ps1 at command pipeline position 1
Supply values for the following parameters:
Path: C:\documents
Count : 0
Average :
Sum :
Maximum :
Minimum :
Property :
Count : 0
Average :
Sum :
Maximum :
Minimum :
Property :
......
......
Что-то вроде «Select-Object» выбирает вывод «measure», а не имена каталогов, в которых нет файлов/подкаталогов.