SQL Abfrage in Array Laden und Damit nach Dateien suchen
Hallo alle zusammen,
ich bin noch relativ neu im PS Geschäft. Ich habe folgendes Konzept, welches ich gern damit lösen möchte und auch weiss das dies funktioniert, jedoch scheitert es an meinem Syntax- und Befehlswissen hierbei.
Was soll geschehen? Es wird per SQL innerhalb des PS-Skripts eine Abfrage getätigt. Hiebei wird mit eine Liste ausgespuckt. Die Werte der Liste, sind auch in verschiedenen Dateinnamen enthalten, welche ich in einem Bestimmten Ordner und Unterordner suchen möchte. Wenn ich diese gefunden habe, soll diese Datei in einen anderen Ordner "kopiert" werden.
Beispiel:
Ergebnis der Tabelle
20191234
20191235
20191236
...
diese Werte möchte ich in einem Array, Zeile, für Zeile einlesen. Ergebnis sollte sein:
$array=20191234
$array[1]=20191235
$array[2]=20191236
Nächster Schritt, Suche alle *.txt Dateien, welche diese Zahlenkombination enthalten. Dateiname wäre: "V_INV_04032019_20191234_M.txt", befinden können sich die Datein aber in verschiedenen Unterordnern.
Wurde diese Datei gefunden, soll sie in einen anderen Ordner kopiert werden bspw. "C:\Ordner\Datei". Fertig.
Ich habe es hinbekommen die Tabelle zu generieren und auch Dateien mit Endung *.txt in einer CSV auszugeben, als Testdatensatz (dient jedoch eher zu Kontrolle) - jedoch nicht die Verbindung der einzelnen Schritte.
Ich bedanke mich vorab, für jegliche Hilfe!
Mein bisheriges Script:
ich bin noch relativ neu im PS Geschäft. Ich habe folgendes Konzept, welches ich gern damit lösen möchte und auch weiss das dies funktioniert, jedoch scheitert es an meinem Syntax- und Befehlswissen hierbei.
Was soll geschehen? Es wird per SQL innerhalb des PS-Skripts eine Abfrage getätigt. Hiebei wird mit eine Liste ausgespuckt. Die Werte der Liste, sind auch in verschiedenen Dateinnamen enthalten, welche ich in einem Bestimmten Ordner und Unterordner suchen möchte. Wenn ich diese gefunden habe, soll diese Datei in einen anderen Ordner "kopiert" werden.
Beispiel:
Ergebnis der Tabelle
20191234
20191235
20191236
...
diese Werte möchte ich in einem Array, Zeile, für Zeile einlesen. Ergebnis sollte sein:
$array=20191234
$array[1]=20191235
$array[2]=20191236
Nächster Schritt, Suche alle *.txt Dateien, welche diese Zahlenkombination enthalten. Dateiname wäre: "V_INV_04032019_20191234_M.txt", befinden können sich die Datein aber in verschiedenen Unterordnern.
Wurde diese Datei gefunden, soll sie in einen anderen Ordner kopiert werden bspw. "C:\Ordner\Datei". Fertig.
Ich habe es hinbekommen die Tabelle zu generieren und auch Dateien mit Endung *.txt in einer CSV auszugeben, als Testdatensatz (dient jedoch eher zu Kontrolle) - jedoch nicht die Verbindung der einzelnen Schritte.
Ich bedanke mich vorab, für jegliche Hilfe!
Mein bisheriges Script:
$vPfad="C:\xxx\xxx"
$vDatum=get-date
$vCommand='select left(mc,len(mc)-5) as Datei from fBasis where Num2>0 and (C_DATE < GETDATE()-2) and TableMC like ''2019%'' order by C_DATE desc'
function querySQL {
Param(
[string]$cSQL
)
$connectionString = "Data Source=SERVER\db; Initial Catalog=db_TST; user id=admin; pwd=xxx"
$connection = new-object system.data.SqlClient.SQLConnection($connectionString)
$command = new-object system.data.sqlclient.sqlcommand($cSQL,$connection)
$connection.Open()
$adapter = New-Object System.Data.sqlclient.sqlDataAdapter $command
$dataset = New-Object System.Data.DataSet
$adapter.Fill($dataSet) | Out-null
$connection.Close()
$dataSet.Tables
}
querySQL -cSQL $vCommand
#Liste der Dateien druchgehen
Get-ChildItem -Path $vPfad -Include *.txt -Recurse |
Where-Object -FilterScript {($_.LastWriteTime -lt $vDatum.tostring("MM/dd/yyyy HH:mm:ss"))}|
Select-Object Name |
Export-Csv "$vPfad\test.csv" -NoTypeInformation
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 473680
Url: https://administrator.de/contentid/473680
Ausgedruckt am: 22.11.2024 um 12:11 Uhr
12 Kommentare
Neuester Kommentar
# Da du Ein Tables-Object in der SQL-Funktion zurückgibst nimmst du die erste Table und darin die Spalte mit dem Namen "Datei" da du ja in deiner Query nur diese Spalte abfragst
$result = (querySQL -cSQL $vCommand).Datei
# Alle möglichen Dateien in Array speichern
$files = Get-ChildItem -Path $vPfad -Include *.txt -Recurse | ?{$_.LastWriteTime -lt $vDatum}
# regex OR-Pattern aller SQL-Ergebnisse erzeugen
$pattern = ($result | %{[regex]::escape($_)}) -join "|"
# Aus den Dateien die ausfiltern die dem Pattern entsprechen und in den Zielordner kopieren.
$files | ?{$_.Basename -match $pattern} | copy-item -Destination 'C:\Ordner' -verbose
Zitat von @robdox:
Wozu diente das $_ grundlegend? Ich habe dies bis jetzt noch nicht verstanden, trz mehrmaligen nachlesen.
Das ist das aktuelle Objekt in der Pipeline, einfach Doku lesen:Wozu diente das $_ grundlegend? Ich habe dies bis jetzt noch nicht verstanden, trz mehrmaligen nachlesen.
https://itknowledgeexchange.techtarget.com/powershell/using-_/
#das Pattern wird richtig ausgelasen, jedoch versehen mit einem "\" welches ich ersetze
$pattern=$pattern.Replace("\ "," ")
FALSCH !! Die Backslashes müssen dahin weil in Regular Expressions bestimmte Zeichen escaped werden müssen!!! Deswegen ja die Regex.Escape Funktion.$pattern=$pattern.Replace("\ "," ")
Beschäftige dich erst mal mit Regular Expressions:
https://danielfett.de/2006/03/20/regulaere-ausdruecke-tutorial/
Hab ich ein Denkfehler? Oder warum werden alle Datein in den Unterordnern kopiert, nicht jene, die ich vorhrer mit SQL Abfrage?
Wenn du es nicht wie vorgesehen anwendest und deinen eigenen Wurscht reinverwurstest kein Wunder .Btw. jetzt für den simplen Schmuh schon wieder einen neuen Thread verschwenden??
Schau mal genau hin, du hast noch mehr meines Codes einfach abgeändert und nicht so übernommen wie ich es dir vorgespielt habe. Ist also kein Wunder, dein Datumsvergleich kann so niemals klappen wenn du Birnen mit Äpfeln vergleichst. Meine Variante klappt hier übrigens einwandfrei.
Man man man die Hitze setzt euch aber zu Leute, schafft euch mal ne vernünftige Klima an!
Man man man die Hitze setzt euch aber zu Leute, schafft euch mal ne vernünftige Klima an!
Klappt hier wie gesagt auch mit ungewöhnlichen Namen problemlos. Du wendest es offensichtlich nur falsch
Wie es geht steht ganz oben in der Lösung!
Ich bin raus, ist ja als gelöst markiert, ciao.
$finalfiles
gibbet ned.$finalfiles | ?{$trimfiles -match $pattern}
Und das macht überhaupt keinen Sinn, denk doch mal nach!!$vDatum
Den Inhalt davon sieht hier auch keiner, also sinnlos hier weiter zu machen wenn du hier solche Durcheinander hier postest.Wie es geht steht ganz oben in der Lösung!
Ich bin raus, ist ja als gelöst markiert, ciao.
2019104377-9313\ 2019104378-9313\ 2019104379-9313\
Ist doch eindeutig, du als Ausgabe der SQL Funktion kein Array sondern hast nur Leerzeichen zwischen den Nummern . Am LiveSystem entweder veraltete PS , Variable vorher als String statt Array benutzt oder Arraytrenner falsch eingestellt. Deswegen kann das ja nicht laufen, weil kein kein Array und damit keine korrekte Trennung mit dem regex Operator |.