Wie teste ich in Powershell, ob ein Verzeichnis leer ist?
powershell
Oberst Panik
quelle
quelle
Antworten:
Versuche dies...
$directoryInfo = Get-ChildItem C:\temp | Measure-Object $directoryInfo.count #Returns the count of all of the objects in the directory
Wenn ja
$directoryInfo.count -eq 0
, ist Ihr Verzeichnis leer.quelle
gci
Versteckte Dateien werden standardmäßig nicht angezeigt, daher benötigen Sie den-force
Parameter, um sicherzustellen, dass das Verzeichnis wirklich leer ist.-force
wird diedesktop.ini
versteckte Systemdatei-file
Parameter zu Get-ChildItem hinzu, z. B.$directoryInfo = Get-ChildItem C:\temp -file | Measure-Object
Wenn Sie nicht an versteckten oder Systemdateien interessiert sind, können Sie auch Test-Path verwenden
Um festzustellen, ob eine Datei im Verzeichnis vorhanden ist
.\temp
, können Sie Folgendes verwenden:oder kurz:
quelle
Test-Path .\temp\*
(ohne-Path
) auskommen .Um zu verhindern, dass jede Datei unter c: \ Temp aufgelistet wird (was zeitaufwändig sein kann), können wir Folgendes tun:
if((Get-ChildItem c:\temp\ -force | Select-Object -First 1 | Measure-Object).Count -eq 0) { # folder is empty }
quelle
(Get-ChildItem -LiteralPath 'S:\Test\' -File -Force | Select-Object -First 1 | Measure-Object).Count -ne 0
anstelle von, um zu überprüfen, ob Dateien in einem Ordner vorhanden sindTest-Path 'S:\Test\*' -PathType Leaf
.filter Test-DirectoryEmpty { [bool](Get-ChildItem $_\* -Force) }
quelle
Eine Linie:
if( (Get-ChildItem C:\temp | Measure-Object).Count -eq 0) { #Folder Empty }
quelle
Wenn Sie nur zu JPBlanc hinzufügen und der Verzeichnispfad $ DirPath lautet, funktioniert dieser Code auch für Pfade mit eckigen Klammern.
# 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 }
quelle
Es ist eine Verschwendung, alle Dateien und Verzeichnisse abzurufen und nur zu zählen, um festzustellen, ob das Verzeichnis leer ist. Viel besser .NET zu verwenden
EnumerateFileSystemInfos
$directory = Get-Item -Path "c:\temp" if (!($directory.EnumerateFileSystemInfos() | select -First 1)) { "empty" }
quelle
################################################# # 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 }
quelle
Einfacher Ansatz
if (-Not (Test-Path .\temp*) { #do your stuff here }
Sie können entfernen,
-Not
wenn Sie das 'if' eingeben möchten, wenn Dateien vorhanden sindquelle
Beispiel zum Entfernen eines leeren Ordners:
IF ((Get-ChildItem "$env:SystemDrive\test" | Measure-Object).Count -eq 0) { remove-Item "$env:SystemDrive\test" -force }
quelle
$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" }
quelle
#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}
quelle
-Path $_.FullName
Get-ChildItem verwenden, können hier ernsthafte Probleme auftreten . Bitte benutze -LiteralPath !!!Das Abrufen einer Zählung von Get-ChildItem kann zu falschen Ergebnissen führen, da ein leerer Ordner oder ein Fehler beim Zugriff auf einen Ordner zu einer Zählung von 0 führen kann.
Ich suche nach leeren Ordnern, um Fehler zu trennen:
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" } }
Der obige Code versucht zuerst, auf den Ordner zuzugreifen. Wenn ein Fehler auftritt, wird ausgegeben, dass ein Fehler aufgetreten ist. Wenn kein Fehler aufgetreten ist, geben Sie an, dass auf "Ordner kann zugegriffen werden", und überprüfen Sie als nächstes, ob er leer ist.
quelle
Nachdem ich einige der vorhandenen Antworten untersucht und ein wenig experimentiert hatte, kam ich zu folgendem Ansatz:
function Test-Dir-Valid-Empty { param([string]$dir) (Test-Path ($dir)) -AND ((Get-ChildItem -att d,h,a $dir).count -eq 0) }
Dies wird zuerst nach einem gültigen Verzeichnis suchen (
Test-Path ($dir)
). Es wird dann prüfen , für Inhalte , einschließlich aller Verzeichnisse, versteckte Datei oder „normale“ Dateien ** aufgrund der Attributed
,h
unda
, respectively.Die Verwendung sollte klar genug sein:
PS C_\> Test-Dir-Valid-Empty projects\some-folder False
...oder alternativ:
PS C:\> if(Test-Dir-Valid-Empty projects\some-folder){ "empty!" } else { "Not Empty." } Not Empty.
** Eigentlich bin ich nicht 100% sicher, was der definierte Effekt von
a
hier ist, aber es führt auf jeden Fall dazu, dass alle Dateien enthalten sind. Die Dokumentation besagt, dassah
versteckte Dateien angezeigt werden, und ich glaube , dass Systemdateien angezeigt werdenas
sollten, also schätze ich, dassa
allein nur "normale" Dateien angezeigt werden. Wenn Sie es aus der obigen Funktion entfernen, werden auf jeden Fall versteckte Dateien gefunden, andere jedoch nicht.quelle
Mit dieser Methode
.GetFileSystemInfos().Count
können Sie die Anzahl der Verzeichnisse überprüfen. Microsoft Docs$docs = Get-ChildItem -Path .\Documents\Test $docs.GetFileSystemInfos().Count
quelle