Powershell Frage zu Ordner und Dateien finden?
Hallo.
Ich suche einen Weg mit dem ich Dateinamen mit dem übergeordneten Ordner in Array schreiben kann.
Ich habe z.b.:
c:\Temp\MFU\50150\xy.txt
c:\Temp\MFU\50156\zxy.txt
usw.
und ich möchte jetzt den Ordner
C:\Temp\
durchsuchen
und alle darinliegenden Dateien mit Samt dem übergeorgnet Ordner in eine Variable speichern. So das z.b. der Index 0 der Variable $files ist:
50150\xy.txt
Hat da jemand vielleicht eine einfache Lösung.
Würde mich sehr über Hilfe freuen.
Gruß Thomas
2 Antworten
Hast Du Dir schon jemals alle Propertys einer Datei anzeigen anzeigen lassen? (zur Demo die win.ini, weil's die immer gibt)
dir $env:SystemRoot\win.ini|fl *
Wir brauchen die Property Directory und Name um unseren Variableninhalt zu basteln. ...und das dazu noch das Cmdlet Split-Path
'c:\belibiger Pfad\blah und blub\0815' | Split-Path -Leaf
...liefert liefert Dir das "letzte Blatt" am "Ast" eines PfadStrings. 😉 uns Name ist der Dateiname. (das würde ich bevorzugen
dir $env:temp -rec -file| % {
'{0}\{1}' -f (Split-Path $_.Directory -Leaf), $_.Name
}
Du kann einen Pfad auch an den "\" in ein Array zerlegen, die letzten beiden Elemente auswählen und wieder mit einem "\" zusammensetzen.
(('c:\belibiger Pfad\blah und blub\0815\xy.txt' -split '\\')|select -last 2) -join '\'
#oder
('c:\belibiger Pfad\blah und blub\0815\xy.txt' -split '\\')[-2..-1] -join '\'
..sieht ist gruselig aus😱
dir $env:temp -rec -file| % {
(($_.FullName -split '\\')|select -last 2) -join '\'
}
...aber nun zu Deiner Zielvariable, welche abhängig von der Anzahl der übergebenen Elemente mal eine normale Variable ist und mal ein Array ? (vermute ich mal 🤔, darüber stolpern viele)
...übergeben wir nur einen Wert...
$Names=(dir $env:SystemRoot\win.ini).Name
$names[0]
...liefert Dir den 1.Charakter eines Strings (weil die Variable nur eine normale StringVariable ist)
...bei mehreren übergebenen Elementen ist unsere Variable ein Array
$Names=(dir $env:SystemRoot\*.exe ).Name
$names[0]
...Powershell typisiert eine Variable anhand ihres Inhalts automatisch!
Es denn, wir legen den Typ fest:
#Explizit durch Typisierung
[Array]$Names=(dir $env:SystemRoot\win.ini).Name
$names[0]
#Implizit, indem wir das Ergebnis innerhalb eines Array übergeben
$Names=@( (dir $env:SystemRoot\win.ini).Name )
$names[0]
Also du willst alle Dateien in allen Unterordnern haben und dazu jeweils den Namen vom Ordner in dem die Dateien liegen (ohne den kompletten Pfad)?
$files = dir C:\temp\ -Recurse -File | foreach {$_.Directory.Name + "\" + $_.Name}
Ich weiß zwar nicht, was du vorhast, aber meistens ist es besser, direkt mit den File-Objekten weiterzuarbeiten und nicht mit den Strings.
Natürlich lässt sich das indexieren. Man kriegt halt nur jeden Buchstaben des Ergebnisses einzeln raus 😂
Hab tatsächlich nicht drüber nachgedacht, also hier nochmal die korrigierte Variante mit einem @(...) außen rum:
$files = @(dir C:\temp\ -Recurse -File | foreach {$_.Directory.Name + "\" + $_.Name})
und wenn nur ein Name übergeben wird, ist $files kein Array😏, welches sich indexieren ließe...