thor2511
Goto Top

Powershell Script Ordner anhand CSV-Kriterien verschieben

Moin, moin,

ich habe hier folgende Ordnerstruktur:

altclasspaths

Alle Ordner die mit
Alt-
beginnen, sind leer.

Der Ordner
Test-Local
hat folgende Struktur:

altclasspathsi

Außerdem habe ich aus einer CSV-Datei die Variable
$MoveInAltClasses
erzeugt, die
folgenden Inhalt hat:

csv

Die Spalte
AltClass
beinhaltet die Ordnernamen der Ordner, die mit
Alt-
beginnen, ohne das Präfix
Alt-
und das Suffix
-Local
.

Die Spalte
ID
beinhaltet die Ordnernamen, die sich im Ordner
Test-Local
befinden.

Nun möchte ich folgendes erreichen:

Anhand der Variable
MoveInAltClasses
sollen alle Ordner aus
Test-Local
in die entsprechenden
Alts-*
Ordner verschoben werden.

Also: der Ordner mit der ID
CS30611M
kommt mit allem, was drin ist, in
Alt-HH22A-Local
usw.

Ich weiß einfach nicht, wie ich das hinbekomme. Könnte mir jemand helfen?

Vielen Dank

Thorsten

Content-Key: 4353611700

Url: https://administrator.de/contentid/4353611700

Printed on: May 5, 2024 at 07:05 o'clock

Mitglied: 4091525239
Solution 4091525239 Oct 21, 2022 updated at 09:00:40 (UTC)
Goto Top
# Ordnerpfad der Alt* und Test-Local Ordner beinhaltet
$folder = "d:\root"  
$MoveInAltClasses | %{
    move-item -Literalpath "$folder\Test-Local\$($_.Id)" -Destination (md "$folder\Alt-$($_.AltClass)-Local" -Force).Fullname  
}
Member: thor2511
thor2511 Oct 21, 2022 at 09:34:45 (UTC)
Goto Top
Es geht, suuper! Vielen Dank!

Ich will aber nicht nur Lösungen konsumieren, sondern verstehen, läuft.

Warum ist hier
-Literalpath
nötig?

Danke !!
Mitglied: 4091525239
4091525239 Oct 21, 2022 updated at 09:40:04 (UTC)
Goto Top
Zitat von @thor2511:

Es geht, suuper! Vielen Dank!

Ich will aber nicht nur Lösungen konsumieren, sondern verstehen, läuft.

Warum ist hier
-Literalpath
nötig?

Danke !!

Ist nur für den Fall das Sonderzeichen im Pfad vorhanden sind und diese dann nicht falsch interpretiert werden, wie z.B. [ ] ? usw.
LiteralPath sollte man laut Best Practice immer statt Path verwenden wenn man nicht will das Sonderzeichen expandiert werden könnten und so zu ungewollten Fehlern oder nicht gewollten Aktionen führen, denn bei LiteralPath findet keine Filesystem-Wildcard Interpretation statt
Member: thor2511
thor2511 Oct 21, 2022 at 09:45:48 (UTC)
Goto Top
Danke schön!
Member: thor2511
thor2511 Oct 23, 2022 at 07:49:07 (UTC)
Goto Top
Sorry, ich muss doch nochmal nerven. Ich hab jetzt selber mit ForEach experimentiert, um folgendes zu erreichen.

Ich habe:

$MoveInAltClassPaths 
csv

und viele Einträge in
$cfg
, die folgendermaßen aufgebaut sind:
\classMember{Name}{Vorname}{ID/KA-GROTHE} 
\classMember{Name}{Vorname}{CS30611M/KA-GROTHE} 
\classMember{Name}{Vorname}{FN30616M/KA-GROTHE} 
\classMember{Name}{Vorname}{TG1412M/KA-GROTHE} 

Wenn die ID's aus $MoveInAltClassPaths mit denen aus $CFG übereinstimmen (das ist natürlich
nicht bei allen Einträgen so), soll {ID/KA-GROTHE} zu *{C:\IrgendeinPfad\ID/KA-GROTHE} werden.

Probiert habe ich
$MoveInAltClasses | ForEach-Object{ $Cfg -replace("$($_.ID)","IrgendeinPfad") }  

Das funktioniert aber nur bei genau einem Eintrag, alle anderen matches werden ignoriert.

Was mache ich falsch?

Nochmals Danke für die Geduld!
Mitglied: 4091525239
Solution 4091525239 Oct 23, 2022 updated at 10:13:54 (UTC)
Goto Top
Das funktioniert aber nur bei genau einem Eintrag, alle anderen matches werden ignoriert.
Weil du bei jedem Durchlauf immer wieder nur aus dem Original-Inhalt ersetzt statt die Ersetzung bei jedem Durchlauf auch wieder in die Variable $cfg zurück zu schreiben.
Member: thor2511
Solution thor2511 Oct 23, 2022 at 10:25:57 (UTC)
Goto Top
Zitat von @4091525239:

Weil du bei jedem Durchlauf immer wieder nur aus dem Original-Inhalt ersetzt statt die Ersetzung bei jedem Durchlauf auch wieder in die Variable $cfg zurück zu schreiben.

Bingo, ich hab den Wald vor lauter Bäumen nicht gesehen. Das hier funktioniert:
$MoveInAltClasses | ForEach-Object{ $Cfg = $Cfg -replace("$($_.ID)","IrgendeinPfad") }  

Vielen Dank!