(PS) 3 Hashtables zum finden von Ordernamen
Hallo,
Folgende Ausgangssituation:
Ich habe 3 Hastables.
$a = @{
Eins="EINS"
Zwei="ZWEI"
Drei="DREI"}
$b = @{
Blau="BLAU"
Schwarz="SCHWARZ"
Gelb="GELB"}
$c = @{
Haus="HAUS"
Baum="BAUM"
Zaun="ZAUN"}
Powershell soll alle Ordnernamen prüfen ob von JEDER Hastable genau 1 Wert(Key) im Ordnernamen vorhanden ist.
Treffer Wären:
C:\123_Eins_Blau_Haus_123\Datei.txt
C:\123_Drei_Blau_Haus_123\Datei.txt
C:\123_Drei_Gelb_Baum_123\Datei.txt
KEIN Treffer:
C:\123_Eins_Haus_123\Datei.txt
C:\123_Gelb_Zaun_123\Datei.txt
es muss also im Ordnernamen immer aus jeder Hashtable 1 Wert zutreffen und dann die Datei verschoben werden mit der Möglichkeit den Value des "Treffers" für die -Destination zu nutzen.
Ziele in dem Beispiel wären:
C:\123_EINS_BLAU_HAUS_123\Datei.txt
C:\123_DREI_BLAU_HAUS_123\Datei.txt
C:\123_DREI_GELB_BAUM_123\Datei.txt
das wäre so das grobe, den rest könnte ich mir dann selber zurecht basteln. Habt ihr eine Idee?
Folgende Ausgangssituation:
Ich habe 3 Hastables.
$a = @{
Eins="EINS"
Zwei="ZWEI"
Drei="DREI"}
$b = @{
Blau="BLAU"
Schwarz="SCHWARZ"
Gelb="GELB"}
$c = @{
Haus="HAUS"
Baum="BAUM"
Zaun="ZAUN"}
Powershell soll alle Ordnernamen prüfen ob von JEDER Hastable genau 1 Wert(Key) im Ordnernamen vorhanden ist.
Treffer Wären:
C:\123_Eins_Blau_Haus_123\Datei.txt
C:\123_Drei_Blau_Haus_123\Datei.txt
C:\123_Drei_Gelb_Baum_123\Datei.txt
KEIN Treffer:
C:\123_Eins_Haus_123\Datei.txt
C:\123_Gelb_Zaun_123\Datei.txt
es muss also im Ordnernamen immer aus jeder Hashtable 1 Wert zutreffen und dann die Datei verschoben werden mit der Möglichkeit den Value des "Treffers" für die -Destination zu nutzen.
Ziele in dem Beispiel wären:
C:\123_EINS_BLAU_HAUS_123\Datei.txt
C:\123_DREI_BLAU_HAUS_123\Datei.txt
C:\123_DREI_GELB_BAUM_123\Datei.txt
das wäre so das grobe, den rest könnte ich mir dann selber zurecht basteln. Habt ihr eine Idee?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 391728
Url: https://administrator.de/forum/ps-3-hashtables-zum-finden-von-ordernamen-391728.html
Ausgedruckt am: 19.02.2025 um 22:02 Uhr
11 Kommentare
Neuester Kommentar

$a = @{
Eins="EINS"
Zwei="ZWEI"
Drei="DREI"}
$b = @{
Blau="BLAU"
Schwarz="SCHWARZ"
Gelb="GELB"}
$c = @{
Haus="HAUS"
Baum="BAUM"
Zaun="ZAUN"}
$root = 'D:\Ordner'
gci $root -File -Recurse | %{
if ($_.Directory.Name -match (($a.GetEnumerator() | %{[regex]::Escape($_.Value)}) -join '|') ){
$part1 = $matches
if ($_.Directory.Name -match (($b.GetEnumerator() | %{[regex]::Escape($_.Value)}) -join '|') ){
$part2 = $matches
if ($_.Directory.Name -match (($c.GetEnumerator() | %{[regex]::Escape($_.Value)}) -join '|') ){
$part3 = $matches
$dest = "$root\123_${part1}_${part2}_${part3}_123"
if (!(Test-Path $dest)){md $dest -Force | out-null}
$_ | move-item -destination $dest -Force
}
}
}
}
Gruß l.

Füge ich irgenwo einfach ein ä ein dann findet das script keine treffer.
Kann ich nicht bestätigen, dann muss das Encoding deiner Datei nicht stimmen. Umlaute werden nur mit korrektem Encoding gefunden und Sonderzeichen ebenso, außerdem werden diese korrekt für das Regex escaped.Siehe Beispiel mit Sonderzeichen:
https://tio.run/##rZLRTtswFIbv/RSelanJhQO0d0iRaNfQIrFqaumQylDkhtPGKIkrx1 ...

Zitat von @functionstrut:
das stimmt, so wie in deinem link, funktioniert es. Aber in diesem Fall:
https://tio.run/##rZLRTtswFIbv/RSelanJhQO0d0iRaNfQIrFqaumQylDkhtPGKIkrx1 ...
klappt die Ausgabe nicht.
Doch klappt doch, Ausgabe ist korrekt!das stimmt, so wie in deinem link, funktioniert es. Aber in diesem Fall:
https://tio.run/##rZLRTtswFIbv/RSelanJhQO0d0iRaNfQIrFqaumQylDkhtPGKIkrx1 ...
klappt die Ausgabe nicht.
Ich habe im Key Sonderzeichen drin und nicht nur im Value.
Das ist wurscht. Der Key kommt hier gar nicht zum Einsatz, sondern nur der Value!! Du ymachst irgendwas falsch. Ich kann es hier leider nicht sehen, und ich kann überall Sonderzeichen oder sonst was einpflanzen geht einwandfrei. Was du natürlich beachten musst ist das in einer Hashtable natürlich keine doppelten Einträge geben darf.
Zitat von @functionstrut:
Na Guck jetzt haben wir den Fehler gefunden
denn der Ordner muss ja den Key enthalten und nicht den Value.
Tja wenn man das nicht schreibt weiß es keiner ...Na Guck jetzt haben wir den Fehler gefunden
Wie kann man das umändern?
Tipp damit du auch noch selber was zu knobeln hast: $_.Key 
Schade wäre nicht viel zu ändern gewesen ...
$a = @{
Eins="EINS"
Zwei="ZWEI"
Drei="DREI"}
$b = @{
Blau="BLAU"
Schwarz="SCHWARZ"
Gelb="GELB"}
$c = @{
Häus-Eins="HäUS-Zwö"
Baum="BAUM"
Zaun="ZAUN"}
$root = 'D:\Ordner'
$crit1 = (($a.GetEnumerator() | %{[regex]::Escape($_.Key)}) -join '|')
$crit2 = (($b.GetEnumerator() | %{[regex]::Escape($_.Key)}) -join '|')
$crit3 = (($c.GetEnumerator() | %{[regex]::Escape($_.Key)}) -join '|')
gci $root -File -Recurse | %{
if ($_.Directory.Name -match $crit1 ){
$part1 = $matches
if ($_.Directory.Name -match $crit2){
$part2 = $matches
if ($_.Directory.Name -match $crit3){
$part3 = $matches
$dest = "$root\123_$($a[$part1])_$($b[$part2])_$($c[$part3])_123"
if (!(Test-Path $dest)){md $dest -Force | out-null}
$_ | move-item -destination $dest -Force -verbose
}
}
}
}