Wie teste ich in Powershell, ob ein Verzeichnis leer ist?
Wie teste ich in Powershell, ob ein Verzeichnis leer ist?
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.
gciVersteckte Dateien werden standardmäßig nicht angezeigt, daher benötigen Sie den -forceParameter, um sicherzustellen, dass das Verzeichnis wirklich leer ist.
-forcewird die desktop.iniversteckte Systemdatei
-fileParameter 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:
Test-Path -Path .\temp\*
oder kurz:
Test-Path .\temp\*
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
}
(Get-ChildItem -LiteralPath 'S:\Test\' -File -Force | Select-Object -First 1 | Measure-Object).Count -ne 0anstelle von, um zu überprüfen, ob Dateien in einem Ordner vorhanden sind Test-Path 'S:\Test\*' -PathType Leaf.
Eine Linie:
if( (Get-ChildItem C:\temp | Measure-Object).Count -eq 0)
{
#Folder Empty
}
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
}
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 verwendenEnumerateFileSystemInfos
$directory = Get-Item -Path "c:\temp"
if (!($directory.EnumerateFileSystemInfos() | select -First 1))
{
"empty"
}
#################################################
# 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 = "yourdistrolist@conoso.com"
$fromadd = "yourMonitoringEmail@conoso.com"
$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
}
Einfacher Ansatz
if (-Not (Test-Path .\temp*)
{
#do your stuff here
}
Sie können entfernen, -Notwenn Sie das 'if' eingeben möchten, wenn Dateien vorhanden sind
Beispiel zum Entfernen eines leeren Ordners:
IF ((Get-ChildItem "$env:SystemDrive\test" | Measure-Object).Count -eq 0) {
remove-Item "$env:SystemDrive\test" -force
}
#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}
-Path $_.FullNameGet-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.
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 Attribute d, hund a, 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 ahier ist, aber es führt auf jeden Fall dazu, dass alle Dateien enthalten sind. Die Dokumentation besagt, dass ahversteckte Dateien angezeigt werden, und ich glaube , dass Systemdateien angezeigt werden assollten, also schätze ich, dass aallein nur "normale" Dateien angezeigt werden. Wenn Sie es aus der obigen Funktion entfernen, werden auf jeden Fall versteckte Dateien gefunden, andere jedoch nicht.
Mit dieser Methode .GetFileSystemInfos().Countkönnen Sie die Anzahl der Verzeichnisse überprüfen. Microsoft Docs
$docs = Get-ChildItem -Path .\Documents\Test
$docs.GetFileSystemInfos().Count