johnworks
Goto Top

Powershell - Automatisierung in der Dateiablage

Hallo Zusammen,

wir haben ein kleine Anwendung die automatisch Daten wegsortiert. Diese soll nun durch eine Powershell + Aufgabenüberwachtung ersetzt werden.

Was soll passieren?

1) aktive Auftragsnummern werden in Array eingelesen (MS SQL-Server) [erledigt]
2) Dateiname (string) wird mit Like auf Vorhandensein einer Nummer prüfen
3) in Verzeichnis verschieben [erledigt]

Nun habe ich eine Frage zu Schritt 2:
Lasse ich nun durch alle Auftragsnummern im Array ein For-Each-Schleife laufen und wenn ich einen Treffer habe break und dann Schritt 3?
Alternative wäre, im String auf eine Zahl zu casten und diese dann im Array zu suchen?

Welche Variante wird mir eine höhere Performance bieten? Es geht eher um eine kleine Menge an Auftragsnummern (5.000).

Viele Grüße,

John

Content-ID: 382573

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

Ausgedruckt am: 22.11.2024 um 18:11 Uhr

NetzwerkDude
NetzwerkDude 07.08.2018 aktualisiert um 14:36:31 Uhr
Goto Top
Arrays bieten in Powershell die .Contains() Methode, die ist recht flink:

Code:
$array = 1..100000000
Measure-Command {$array.contains(99999999)}

Ergebnis:
Milliseconds      : 435

Edit: Also ich würde auch gerne das Ergebnis von Foreach posten, aber die Abfrage läuft noch face-smile

Edit2: 12 Minuten mit einem i7-4770 face-smile
colinardo
Lösung colinardo 07.08.2018 aktualisiert um 13:59:21 Uhr
Goto Top
Welche Variante wird mir eine höhere Performance bieten?
Teste doch einfach selbst mit "Measure-Command" face-smile. Beispiel
$dateiname = "Hallo das ist ein 888 test.jpg"  
[array]$numbers = 1..5000

# Extrahieren von Value und Array Check
(Measure-Command {
    [regex]::Match($dateiname,'\d+').Value -in $numbers  
}).TotalMilliseconds

# Mit Regex
(Measure-Command {$dateiname -match ( $numbers -join '|')}).TotalMilliseconds  

# Mit Schleife
(Measure-Command {
    $numbers | %{
        if($dateiname -like "*$_*"){  
            return
        }
    }
}).TotalMilliseconds
Grüße Uwe