Подтвердить что ты не робот

Тест Powershell, если папка пуста

В Powershell, как проверить, пуст ли каталог?

4b9b3361

Ответ 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 сам по себе показывает только "обычные" файлы. Если вы удалите его из функции выше, он в любом случае найдет скрытые файлы, но не другие.