В Powershell, как проверить, пуст ли каталог?
Тест Powershell, если папка пуста
Ответ 1
Попробуйте это...
$directoryInfo = Get-ChildItem C:\temp | Measure-Object
$directoryInfo.count #Returns the count of all of the files in the directory
Если $directoryInfo.count -eq 0
, то ваш каталог пуст.
Ответ 2
Если вас не интересуют скрытые или системные файлы, вы также можете использовать Test-Path
Чтобы увидеть, существует ли файл в каталоге .\temp
вы можете использовать:
Test-Path -Path .\temp\*
или в ближайшее время:
Test-Path .\temp\*
Ответ 3
Чтобы предотвратить перечисление каждого файла в c:\Temp (что может занять много времени), мы можем сделать что-то вроде этого:
if((Get-ChildItem c:\temp\ -force | Select-Object -First 1 | Measure-Object).Count -eq 0)
{
# folder is empty
}
Ответ 4
filter Test-DirectoryEmpty {
[bool](Get-ChildItem $_\* -Force)
}
Ответ 5
Одна строка:
if( (Get-ChildItem C:\temp | Measure-Object).Count -eq 0)
{
#Folder Empty
}
Ответ 6
Просто добавив к JPBlanc, если путь к каталогу равен $DirPath, этот код также работает для путей, включая символы квадратных скобок.
# Make square bracket non-wild card char with back ticks
$DirPathDirty = $DirPath.Replace('[', '`[')
$DirPathDirty = $DirPathDirty.Replace(']', '`]')
if (Test-Path -Path "$DirPathDirty\*") {
# Code for directory not empty
}
else {
# Code for empty directory
}
Ответ 7
Это пустая трата, чтобы получить все файлы и каталоги и подсчитать их только, чтобы определить, пуст ли каталог. Намного лучше использовать .NET EnumerateFileSystemInfos
$directory = Get-Item -Path "c:\temp"
if (!($directory.EnumerateFileSystemInfos() | select -First 1))
{
"empty"
}
Ответ 8
#################################################
# Script to verify if any files exist in the Monitor Folder
# Author Vikas Sukhija
# Co-Authored Greg Rojas
# Date 6/23/16
#################################################
################Define Variables############
$email1 = "[email protected]"
$fromadd = "[email protected]"
$smtpserver ="mailrelay.conoso.com"
$date1 = get-date -Hour 1 -Minute 1 -Second 1
$date2 = get-date -Hour 2 -Minute 2 -Second 2
###############that needs folder monitoring############################
$directory = "C:\Monitor Folder"
$directoryInfo = Get-ChildItem $directory | Measure-Object
$directoryInfo.count
if($directoryInfo.Count -gt '0')
{
#SMTP Relay address
$msg = new-object Net.Mail.MailMessage
$smtp = new-object Net.Mail.SmtpClient($smtpServer)
#Mail sender
$msg.From = $fromadd
#mail recipient
$msg.To.Add($email1)
$msg.Subject = "WARNING : There are " + $directoryInfo.count + " file(s) on " + $env:computername + " in " + " $directory
$msg.Body = "On " + $env:computername + " files have been discovered in the " + $directory + " folder."
$smtp.Send($msg)
}
Else
{
Write-host "No files here" -foregroundcolor Green
}
Ответ 9
Простой подход
if (-Not (Test-Path .\temp*)
{
#do your stuff here
}
вы можете удалить -Not
, если вы хотите ввести "if", когда файлы присутствуют.
Ответ 10
Пример удаления пустой папки:
IF ((Get-ChildItem "$env:SystemDrive\test" | Measure-Object).Count -eq 0) {
remove-Item "$env:SystemDrive\test" -force
}
Ответ 11
$contents = Get-ChildItem -Path "C:\New folder"
if($contents.length -eq "") #If the folder is empty, Get-ChileItem returns empty string
{
Remove-Item "C:\New folder"
echo "Empty folder. Deleted folder"
}
else{
echo "Folder not empty"
}
Ответ 12
#Define Folder Path to assess and delete
$Folder = "C:\Temp\Stuff"
#Delete All Empty Subfolders in a Parent Folder
Get-ChildItem -Path $Folder -Recurse -Force | Where-Object { $_.PSIsContainer -and (Get-ChildItem -Path $_.FullName -Recurse -Force | Where-Object { !$_.PSIsContainer }) -eq $null } | Remove-Item -Force -Recurse
#Delete Parent Folder if empty
If((Get-ChildItem -Path $Folder -force | Select-Object -First 1 | Measure-Object).Count -eq 0) {Remove-Item -Path $CATSFolder -Force -Recurse}
Ответ 13
Получение счетчика от Get-ChildItem может дать ложные результаты, потому что пустая папка или ошибка доступа к папке может привести к нулю.
Я проверяю наличие пустых папок, чтобы отделить ошибки:
Try { # Test if folder can be scanned
$TestPath = Get-ChildItem $Path -ErrorAction SilentlyContinue -ErrorVariable MsgErrTest -Force | Select-Object -First 1
}
Catch {}
If ($MsgErrTest) { "Error accessing folder" }
Else { # Folder can be accessed or is empty
"Folder can be accessed"
If ([string]::IsNullOrEmpty($TestPath)) { # Folder is empty
" Folder is empty"
}
}
Приведенный выше код сначала пытается получить доступ к папке. Если происходит ошибка, выводится, что ошибка произошла. Если ошибки не было, укажите "Доступ к папке", а затем проверьте, не является ли она пустой.
Ответ 14
Изучив некоторые из существующих ответов и немного поэкспериментировав, я в итоге использовал этот подход:
function Test-Dir-Valid-Empty {
param([string]$dir)
(Test-Path ($dir)) -AND ((Get-ChildItem -att d,h,a $dir).count -eq 0)
}
Сначала проверит правильность каталога (Test-Path ($dir)
). Затем он проверит любое содержимое, включая любые каталоги, скрытые файлы или "обычные" файлы ** из-за атрибутов d
, h
и a
, соответственно.
Использование должно быть достаточно понятным:
PS C_\> Test-Dir-Valid-Empty projects\some-folder
False
... или альтернативно:
PS C:\> if(Test-Dir-Valid-Empty projects\some-folder){ "empty!" } else { "Not Empty." }
Not Empty.
** На самом деле я не уверен на 100%, какой здесь определенный эффект от a
, но в любом случае он приводит к включению всех файлов. В документации говорится, что ah
показывает скрытые файлы, и я считаю, что as
должен показывать системные файлы, поэтому я предполагаю, что a
сам по себе показывает только "обычные" файлы. Если вы удалите его из функции выше, он в любом случае найдет скрытые файлы, но не другие.