2016-06-03 10 views
0

ich eine Netzwerkfreigabe mit 20.000 XML-Dateien im Format habenFiltering-Dateien durch einen Teil des Namens Spiel

username-computername.xml

Es gibt doppelte Einträge in Form von (wenn ein Benutzer einen neuen comptuer erhalten)

user1 -computer1.xml
benutzer1-computer2.xml

oder

BLRPPR-SKB52084.xml
BLRSIA-SKB50871.xml
S028DS-SKB51334.xml
s028ds-SKB52424.xml
S02FL6-SKB51644.xml
S02FL6-SKB52197.xml
S02VUD-SKB52083.xml

Da im manipulieren gehen die XMLs später kann ich Eigenschaften des Arrays nicht einfach abweisen, da ich zumindest den vollständigen Pfad brauche. Ziel ist es, wenn ein Duplikat gefunden wird, dasjenige mit dem neueren Zeitstempel zu verwenden. Hier

ist ein snipet des Codes, wo ich diese Logik benötigen

$xmlfiles = Get-ChildItem "network share" 

Hier bin ich nur ein foreach Schleife tun:

foreach ($xmlfile in $xmlfiles) { 
    [xml]$xmlcontent = Get-Content -Path $xmlfile.FullName -Encoding UTF8 
    Select-Xml -Xml $xmlcontent -Xpath " " 
    # create [pscustomobject] etc... 
} 

Wesentlichen, was ich brauche, ist

if ($xmlfiles.Name.Split("-")[0]) - duplicate) { 
    # select the one with higher $xmlfiles.LastWriteTime and store either 
    # the full object or the $xmlfiles.FullName 
} 

Idealerweise sollte das Teil der foreach Schleife nicht zu sein müssen zweimal durchlaufen.

Antwort

2

Sie Group-Object gruppieren Dateien, die von einem benutzerdefinierten Attribut verwenden:

$xmlfiles | Group-Object { $_.Name.Split('-')[0] } 

Die obige Aussage ein Ergebnis wie dieses produzieren:

Count Name Group 
----- ---- ----- 
    1 BLRPPR {BLRPPR-SKB52084.xml} 
    1 BLRSIA {BLRSIA-SKB50871.xml} 
    2 S028DS {S028DS-SKB51334.xml, s028ds-SKB52424.xml} 
    2 S02FL6 {S02FL6-SKB51644.xml, S02FL6-SKB52197.xml} 
    1 S02VUD {S02VUD-SKB52083.xml}

wo die Group Eigenschaft der ursprünglichen FileInfo Objekte enthält.

Erweitern Sie die Gruppen in einer ForEach-Object Schleife, sortieren jede Gruppe von LastWriteTime, und wählen Sie die neueste Datei von ihm:

... | ForEach-Object { 
    $_.Group | Sort-Object LastWriteTime -Desc | Select-Object -First 1 
} 
+0

tödlich. Danke einer Mühle Ansgar. genau das was ich gesucht habe. Alles andere, was ich versuchte, verlor ich die ursprünglichen Objekteigenschaften. während ich sollte nur mit einer Gruppe + Sortierung Combo nach Ihrem Beispiel gegangen. bereits in meinem Code implementiert und funktioniert genauso perfekt wie geplant. Danke noch einmal! –

+0

nur der Vollständigkeit halber, die vorgeschlagene Sortierung | wählen Ansatz, auch wenn seine eine zusätzliche Schleife, kommt nicht mit einer großen Zeitstrafe VERBOSE: Gesamt XMLFiles 17086 VERBOSE: get-Inhalt Lauf in 3,1642018 VERBOSE: gefiltert XMLFiles nach dem Entfernen von Duplikaten 13908 VERBOSE: Filterung nahm 23.7152372 Sekunden –

Verwandte Themen