Powershell: Verzeichnis ohne Datei x
Hallo
Ausgangslage
Verzeichnis mit 2 Unterverzeichnisebenen:
[root]
¦__[Leve1]
¦______[Level2]
In den Verzeichnissen von [Level2] hat es Dateien.
Ich benötige eine Liste aller Verzeichnisse, welche die Datei "weekday.xml" nicht enthalten.
Entwurf
Dieser Entwurf zeigt alle Verzeichnisse der Ebene2 an. Egal ob weekday.xml vorhanden ist.
Hinweis auf meinen Denkfehler erwünscht...
Beste Grüsse
Ausgangslage
Verzeichnis mit 2 Unterverzeichnisebenen:
[root]
¦__[Leve1]
¦______[Level2]
In den Verzeichnissen von [Level2] hat es Dateien.
Ich benötige eine Liste aller Verzeichnisse, welche die Datei "weekday.xml" nicht enthalten.
Entwurf
Get-ChildItem -Path "t:\Kalender\an" -Recurse -Directory | ForEach-Object {
$directory = $_
$containsFile = Get-ChildItem -Path $directory.FullName -Filter "metadata.opf" -File -ErrorAction SilentlyContinue
if (-not $containsFile) {
[PSCustomObject]@{
Directory = $directory.FullName
}
}
} | Format-Table
Dieser Entwurf zeigt alle Verzeichnisse der Ebene2 an. Egal ob weekday.xml vorhanden ist.
Hinweis auf meinen Denkfehler erwünscht...
Beste Grüsse
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 7886732637
Url: https://administrator.de/contentid/7886732637
Ausgedruckt am: 23.11.2024 um 20:11 Uhr
12 Kommentare
Neuester Kommentar
Hi.
ungetestet.
Gruß
# Gib hier den Pfad des übergeordneten Verzeichnisses ein, in dem du suchen möchtest.
$baseDirectory = "C:\Pfad\Zum\Übergeordneten\Verzeichnis"
# Liste aller Verzeichnisse im übergeordneten Verzeichnis abrufen und nach Verzeichnissen ohne "weekday.xml" filtern.
$directoriesWithoutWeekdayXml = Get-ChildItem -Path $baseDirectory -Directory |
Where-Object { -Not (Test-Path (Join-Path $_.FullName "weekday.xml")) }
# Die Liste der Verzeichnisse ohne "weekday.xml" ausgeben.
$directoriesWithoutWeekdayXml | ForEach-Object { $_.FullName }
ungetestet.
Gruß
Moin.
Es geht auch ohne Test-Path
Zeppel
Es geht auch ohne Test-Path
$baseDirectory = "C:\Pfad\Zum\Übergeordneten\Verzeichnis"
Get-ChildItem $baseDirectory -Directory | ?{!$_.GetFiles("weekday.xml")} | select -Expand Fullname
Zeppel
lle Lösungen haben einen Designfehler. D.h. ich habe die Aufgabe nicht klar genug geschildert.
Es sollen nur die Verzeichnisse der Ebene2 nach dieser Datei durchsucht werden.
Die Ebene1 hat nur Verzeichnisse.
In dem Fall liefert dir das hier das Gewünschte, einfach noch ein "\*\*" an die Variable pappen, feddisch.Es sollen nur die Verzeichnisse der Ebene2 nach dieser Datei durchsucht werden.
Die Ebene1 hat nur Verzeichnisse.
$baseDirectory = "C:\Pfad\Zum\Übergeordneten\Verzeichnis"
Get-ChildItem "$baseDirectory\*\*" -Directory | ?{!$_.GetFiles("weekday.xml")} | select -Expand Fullname
Naja kürzer geht hier auch noch ist dann aber für einen Laien der das lesen muss schwer interpretierbar
(ls "$baseDirectory\*\*" -Dir | ?{!$_.GetFiles("weekday.xml")}).Fullname
Ich versuchs mal
Bei dem -dir bin ich mir auch unsicher. Es ist schon mal kein Parameteralias von Get-Childitem
und auch kein Alias von -Directory obwohl genau das ersetzt wurde
Get-Alias dir
CommandType Name Version Source
----------- ---- ------- ------
Alias dir -> Get-ChildItem
Get-Alias ls
CommandType Name Version Source
----------- ---- ------- ------
Alias ls -> Get-ChildItem
Bei dem -dir bin ich mir auch unsicher. Es ist schon mal kein Parameteralias von Get-Childitem
(Get-Command Get-ChildItem).Parameters.Values.aliases
und auch kein Alias von -Directory obwohl genau das ersetzt wurde
(Get-Command Get-ChildItem).Parameters["Directory"].Aliases
ad
d
Zitat von @PeterGyger:
-
-- jetzt wird es unlogisch. "ls" als auch "dir" sind vorgegebe Aliase von GCI (Get-Alias -Definition Get-ChildItem)
ls ist ein Alias für Get-ChildItem korrejt, aber -Dir ist ein Parameter von Get-Childitem und zwar die Abkürzung von -Directory! Das es kein Alias ist erkennst du an dem Dash vor dem Namen somit ist es ein Parameter der Funktion Get-ChildItem.-
-DIR
A: Welchen Zweck hat der Parameter "-ls"? 🚧
ls ist kein Parameter sonder ein Alias von Get-ChildItem.B: Weshalb erhalte ich bei Dir einen Fehler? 🚧
C: Wenn den Parameter "-ls" weglasse, funktioniert das Skript dennoch 🤔🤔🤔
Du wirfst CMDLet(bzw. Alias) und Parameter durcheinander ganz einfach.C: Wenn den Parameter "-ls" weglasse, funktioniert das Skript dennoch 🤔🤔🤔
Es gibt Funktionen (CMDLets) diese lassen sich mit Aliasen aufrufen sofern angelegt , die Funktionen selbst haben Parameter die mit dem Dash(-) eingeleitet werden, aber auch unbenannte Parameter haben können die man direkt angeben kann wie hier bspw. der Pfad. Für die Parameternamen selbst gibt es ebenfalls Abkürzungen wie das -Dir hier bspw. Die Abkürzung von -Directory ist.
Nun klar?
Wenn nicht hier zum nachlesen
https://learn.microsoft.com/en-us/powershell/scripting/developer/cmdlet/ ...
Vielleicht mal von der Pike auf lernen, an einem verregneten Wochenende hat man das durch ...
Powershell Leitfaden für Anfänger