Powershell Frage zu Ordner und Dateien finden?

2 Antworten

Vom Beitragsersteller als hilfreich ausgezeichnet

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]
Woher ich das weiß:eigene Erfahrung – Ich mach das seit 30 Jahren

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.


Erzesel  04.05.2022, 09:27

und wenn nur ein Name übergeben wird, ist $files kein Array😏, welches sich indexieren ließe...

daCypher  04.05.2022, 11:45
@Erzesel

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})