2012-05-11 39 views

Respuesta

27

Try esto ...

$directoryInfo = Get-ChildItem C:\temp | Measure-Object 
$directoryInfo.count #Returns the count of all of the files in the directory 

Si $directoryInfo.count -eq 0, el directorio está vacío.

+5

'gci' won ' t muestra los archivos ocultos de forma predeterminada, por lo que necesitará el parámetro '-force' para asegurarse de que el directorio esté realmente vacío. – SpellingD

+4

¿Tenemos que encontrar cada archivo? Esto puede llevar mucho tiempo. – MuiBienCarlota

+0

@SpellingD que fallará porque una carpeta está realmente vacío, pero al usar '-force' aparecerá el archivo de sistema oculto' desktop.ini' – mikew

35

Si no está interesado en los archivos ocultos o del sistema también puede utilizar Test-Path

para ver si existe un archivo en el directorio .\temp puede utilizar:

Test-Path -Path .\temp\* 
+1

+1 para una manera tan clara de comprobación. Esto debería ser aceptado como respuesta. Por cierto, incluso puedes hacer 'Test-Path. \ Temp \ *' (sin '-Path'). – Neolisk

+0

¿Alguien sabe si esto todavía recurre a través de todo el glob? ¿O se detiene una vez que encuentra * algo *? – kenny

+1

No estoy seguro de entender su pregunta porque si existe un directorio dentro de la temperatura, la temperatura ya no se considera como vacía. – JPBlanc

3
filter Test-DirectoryEmpty { 
    [bool](Get-ChildItem $_\* -Force) 
} 
+0

¿Por qué? !! ¡Gracias por explicar! –

+0

Es para convertir el resultado a booleano. – Joey

1

Simplemente agregando a JPBlanc, si la ruta del directorio es $ DirPath, este código también funciona para rutas que incluyen caracteres de corchetes.

# 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 
    } 
3

Una línea:

if((Get-ChildItem C:\temp | Measure-Object).Count -eq 0) 
{ 
    #Folder Empty 
} 
7

Para evitar la enumeración de cada archivo en c: \ Temp (que puede llevar mucho tiempo), podemos hacer algunas cosas como esta:

if((Get-ChildItem c:\temp\ -force | Select-Object -First 1 | Measure-Object).Count -eq 0) 
{ 
    # folder is empty 
} 
+0

Esta es la solución más rápida, ya que no enumera todos los archivos y simplemente se detiene en la primera encontrada.Para verificar si los archivos están presentes en una carpeta, use '(Get-ChildItem -LiteralPath 'S: \ Test \' -File-Force | Select-Object -First 1 | Measure-Object) .Count -ne 0' en su lugar de 'Test-Path 'S: \ Test \ *' -PathType Leaf'. – DarkLite1

1

¡Es un desperdicio para obtener todos los archivos y directorios y contarlos solo para determinar si el directorio está vacío. Mucho mejor utilizar .NET EnumerateFileSystemInfos

$directory = Get-Item -Path "c:\temp" 
if (!($directory.EnumerateFileSystemInfos() | select -First 1)) 
{ 
    "empty" 
} 
1
################################################# 
# 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 
     } 
+1

Aunque ciertamente quiero alentarlo a publicar en StackOverflow, G, hay varias "mejores prácticas" que está ignorando, intencionalmente o no. (a) En general, no debe simplemente publicar el código sin explicación. (b) No debe volver a publicar la misma respuesta dada por otra persona (la suya se ha dado al menos dos veces si se desplaza por las respuestas aquí). (c) No debe incluir un montón de código no relacionado: el 90% de su código es irrelevante para la pregunta formulada. No voy a declinar, pero solo quería que estuvieras preparado en caso de que veas venir algunos votos atrasados. –

+0

Lo siento y gracias Michael –

0

enfoque simple

if (-Not (Test-Path .\temp*) 
{ 
#do your stuff here 
} 

puede quitar -Not si quieres entrar en el 'si' cuando los archivos están presentes

1

Ejemplo de eliminar vacíos carpeta:

IF ((Get-ChildItem "$env:SystemDrive\test" | Measure-Object).Count -eq 0) { 
    remove-Item "$env:SystemDrive\test" -force 
} 
+1

Escriba su respuesta en inglés, ya que [Stack Overflow es un sitio en inglés] (https://meta.stackexchange.com/q/13676). –

1
$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" 
    } 
Cuestiones relacionadas