Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

gelöst SQL Abfrage in Array Laden und Damit nach Dateien suchen

Mitglied: robdox

robdox (Level 1) - Jetzt verbinden

16.07.2019 um 15:59 Uhr, 375 Aufrufe, 12 Kommentare

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[0]=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:

01.
$vPfad="C:\xxx\xxx"
02.
$vDatum=get-date
03.
$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'
04.

05.
function querySQL {
06.
    Param(
07.
        [string]$cSQL
08.
    )
09.
    
10.
    $connectionString = "Data Source=SERVER\db; Initial Catalog=db_TST; user id=admin; pwd=xxx"
11.
    $connection = new-object system.data.SqlClient.SQLConnection($connectionString)
12.
    $command = new-object system.data.sqlclient.sqlcommand($cSQL,$connection)
13.
    $connection.Open()
14.
    $adapter = New-Object System.Data.sqlclient.sqlDataAdapter $command
15.
    $dataset = New-Object System.Data.DataSet
16.
    $adapter.Fill($dataSet) | Out-null
17.
    $connection.Close()
18.
    $dataSet.Tables
19.
}
20.

21.
querySQL -cSQL $vCommand
22.

23.
#Liste der Dateien druchgehen
24.

25.
    Get-ChildItem -Path $vPfad -Include *.txt -Recurse | 
26.
       Where-Object -FilterScript {($_.LastWriteTime -lt $vDatum.tostring("MM/dd/yyyy HH:mm:ss"))}|
27.
    Select-Object Name | 
28.
       Export-Csv "$vPfad\test.csv" -NoTypeInformation
Mitglied: 140447
LÖSUNG 16.07.2019, aktualisiert um 18:08 Uhr
01.
# 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
02.
$result = (querySQL -cSQL $vCommand)[0].Datei
03.
# Alle möglichen Dateien in Array speichern
04.
$files =  Get-ChildItem -Path $vPfad -Include *.txt -Recurse | ?{$_.LastWriteTime -lt $vDatum}
05.
# regex OR-Pattern aller SQL-Ergebnisse erzeugen
06.
$pattern = ($result | %{[regex]::escape($_)}) -join "|"
07.
# Aus den Dateien die ausfiltern die dem Pattern entsprechen und in den Zielordner kopieren.
08.
$files | ?{$_.Basename -match $pattern} | copy-item -Destination 'C:\Ordner' -verbose
Bitte warten ..
Mitglied: robdox
17.07.2019 um 08:03 Uhr
Vielen lieben Dank! hätte nicht gedacht dass es doch so "einfach" geht.

Wozu diente das $_ grundlegend? Ich habe dies bis jetzt noch nicht verstanden, trz mehrmaligen nachlesen.
Bitte warten ..
Mitglied: 140447
LÖSUNG 17.07.2019, aktualisiert um 08:48 Uhr
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:
https://itknowledgeexchange.techtarget.com/powershell/using-_/
Bitte warten ..
Mitglied: robdox
24.07.2019 um 12:16 Uhr
Hallo,

ich nochmal - ich habe das Skript lokal bei mir ohne Probleme mit Simulationsdaten testen können. Jedoch funktioniert die angepasste Version nicht wie ich möchte.

Hierbei greift der Pattern nicht mit -matches. Es werden mir alle Dateien aufgelistet, nicht die, welche ich in der SQL Abfrage ausgelesen habe.

Der Dateiname ist bei wie folgt: "2019107870-9313.csv.Agent.19-04-24-11-08-59-07"
In der SQL Abfrage bekomme ich folgende Werte "2019107870" welcher nun mit dem Dateinamen abgeglichen werden soll und dann entsprechend in den Zielordner kopiert wird.

Hab ich ein Denkfehler? Oder warum werden alle Datein in den Unterordnern kopiert, nicht jene, die ich vorhrer mit SQL Abfrage?

Vielen Dank wieder an alle für eure Hilfe!

01.

02.

03.
# Variablen festlegen
04.
$vPfad="D:\"
05.
$vArchivPfad="D:\bak"
06.
$vDatum=get-date
07.
$vCommand="select left(mc, charindex('-', right(mc,len(mc)-1))) as Datei from faktura_b where alfanw2 is null and (datediff(day, c_date, current_timestamp) <= 30)"
08.

09.
# SQL Funktion zum zusammenstellen der Prüftabelle
10.
function querySQL {
11.
    Param(
12.
        [string]$cSQL
13.
    )
14.
    # Connectionstring aus m3.config
15.
    $connectionString = "Data Source=XXX; Initial Catalog=XXX; user id=XXX; pwd=XXX"
16.

17.
    # SQL Verbindung aufbauen
18.
    $connection = new-object system.data.SqlClient.SQLConnection($connectionString)
19.
    $command = new-object system.data.sqlclient.sqlcommand($cSQL,$connection)
20.
    $connection.Open()
21.
    $adapter = New-Object System.Data.sqlclient.sqlDataAdapter $command
22.
    $dataset = New-Object System.Data.DataSet
23.
    
24.
    # Tabelle erstellen
25.
    $adapter.Fill($dataSet) | Out-null
26.
    $connection.Close()
27.
    $dataSet.Tables
28.
}
29.

30.
# SQL Tabelle in Array speichern
31.
$result = (querySQL -cSQL $vCommand)[0].Datei
32.

33.
# Liste aller Dateien durchsuchen, welche älter als heute sind
34.
$files = Get-ChildItem -Path $vPfad -Include *.csv.* -Recurse | ? {($_.LastWriteTime -lt $vDatum.tostring("MM/dd/yyyy HH:mm:ss"))}
35.

36.

37.
# Entsprechend der Belegnummer, existierende Dateien auslesen
38.
$pattern=($result | %{[regex]::escape($_)}) -join "|"
39.

40.
#das Pattern wird richtig ausgelasen, jedoch versehen mit einem "\" welches ich ersetze
41.
$pattern=$pattern.Replace("\ "," ")
42.

43.

44.
# Gefundene Dateien für Agenten bereitstellen
45.
$files | ?{$_.Basename -match $pattern} | Copy-Item -Destination $vArchivPfad -Verbose
46.

47.
# --- DEBUG ---
48.
if(($files -eq $null) -or ($result -eq $null)) { write-host "Fehler bei Prüftabelle / Dateien" }
49.
Bitte warten ..
Mitglied: 140447
24.07.2019, aktualisiert um 12:45 Uhr
#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.

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??
Bitte warten ..
Mitglied: robdox
24.07.2019 um 15:33 Uhr
Hey,

danke Dir - Ja habe ich verstanden mit dem Pattern, jedoch bekomme ich das selbige Ergebnis zurückgeliefert. Pattern stimmt, das Ganze mit dem Basename von den Files abzugleichen leider nicht.

BTW: Neuer Thread gelöscht.

Warum funktioniert das Match nicht?
Bitte warten ..
Mitglied: 140447
24.07.2019, aktualisiert um 16:24 Uhr
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!
Bitte warten ..
Mitglied: robdox
05.08.2019 um 11:05 Uhr
Grüß Dich!

also die Hitze wird's nicht gewesen sein wegen der Klima, jedoch komme ich auf kein brauchbares Ergebnis. Ich habe für diese simple Sache nun schon einige Stunden geopfert, mir entzieht sich aber mittlerweile jede verständnisvolle Reproduzierbarkeit.

Die letzten Zeilen habe ich mehrmals analysiert. Ich hatte vermutet, das der Dateiname etwas kryptisch ist (Z.b. " ;19.03.030-92975.csv.Agent.19-04-02-10-08-07-60" - und dieser mit dem Match nichts vergleichbares findet.

Mittlerweile ist es so, das mein Skript keine Dateien findet, bzw. keine Dateien kopiert. Ich habe hierbei lediglich den Basename welcher " ;19.03.030-92975.csv.Agent " heißt, abgeändert auf "19.03.030-92975" da dieser Wert im Pattern auch "19.03.030-92975" vorhanden ist. Anscheinend ist das aber auch nicht der richtige Weg.

So abstrus bzw labidar Dir das auch vorkommen mag, für mich stellt dies hier ein unerklärbares Phänomen dar, zudem das Skript mit normalen *.txt - Endungen funktioniert hatte auf meinem Testsystem.

Hier nochmal die entscheidende Code-Stelle

01.
# Liste aller Dateien durchsuchen, welche älter als heute sind
02.
$files = Get-ChildItem -Path $vPfad -Include *.csv.* -Recurse | ? {($_.LastWriteTime -lt $vDatum)}
03.

04.
# Entsprechend der Belegnummer, existierende Dateien auslesen
05.
$pattern=($result | %{[regex]::escape($_)}) -join "|"
06.

07.
# Gefundene Dateien für Agenten bereitstellen
08.
$trimfiles = $files.Basename 
09.
$trimfiles = $trimfiles.trimend(".csv.M3Agent ")
10.

11.
$finalfiles | ?{$trimfiles -match $pattern} | Copy-Item -Destination $vArchivPfad -Verbose
Ich danke Dir für Deine Mühe wieder vorab!
Bitte warten ..
Mitglied: 140447
05.08.2019, aktualisiert um 11:14 Uhr
Klappt hier wie gesagt auch mit ungewöhnlichen Namen problemlos. Du wendest es offensichtlich nur falsch
$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.
Bitte warten ..
Mitglied: robdox
05.08.2019 um 12:46 Uhr
Hallo,

jetzt sei mal nicht so ;)

ich habe nun noch etwas herausgefunden. Das Skript dem Ursprung angepasst und parallel auf Testsystem und Livesystem, mit identischen Daten getestet.

Auf dem Testsystem funktionierte das Skript mit den neuen Dateien einwandfrei, auf dem Livesystem jedoch nicht.

Ich habe bei der Patternvariable folgenden Unterschied und das ist auch der einzige den es in der Ausgabe gibt, gefunden:

Ergebnis mit
01.
Write-Host $pattern
auf dem Testsystem:
"2019104377-9313|2019104378-9313|2019104379-9313 ... " dabei funktioniert das
01.
-match
einwandfrei und die entsprechenden Dateien werden kopiert.

Auf dem Livesystem (Server) wird mit gleichen Daten, Abfrage, Skript, folgendes Pattern zurückgeliefert:
"2019104377-9313\ 2019104378-9313\ 2019104379-9313\ \ ..."

Kanns sich das / oder du (sofern du nicht wieder genervt bist ;) ) erklären?

Wenn ich es zum Bsp. mit einem Replace "zurechtrücke" werden wieder ALLE Dateien, statt jene, die sich in $Result befinden, kopiert.

Was ist hier das Problem? - der
01.
-join "|"
- Befehl wird schlichtweg ignoriert auf dem Livesystem...

Vielen Dank vorab!
Bitte warten ..
Mitglied: 140447
LÖSUNG 05.08.2019, aktualisiert um 13:14 Uhr
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 |.
Bitte warten ..
Mitglied: robdox
05.08.2019 um 13:49 Uhr
Tja, genau das hat mir geholfen! Ich musste die $result - Variable explizit als array definieren- nun klappts auch im Livesystem! Ich danke Dir!
Bitte warten ..
Ähnliche Inhalte
Visual Studio
SQL to Array
gelöst Frage von PatrickB90Visual Studio2 Kommentare

Moin Zusammen, als erfahrener SysAdmin und VB.net Neueinsteiger stehe ich der Zeit vor einem Problem. Für eine Hilfsorganisation, bin ...

PHP
Mit PHP SQL Array Abfrage
gelöst Frage von gamerffPHP3 Kommentare

Hallo Forum, ich bin grade an einem Projekt dran ein Telefonbuch mit Mysql, PHP und HTMl zu erstellen. Ich ...

Microsoft
SQL LDF Datei SHRINKFILE
gelöst Frage von lupoloMicrosoft7 Kommentare

SQL LDF Datei SHRINKFILE Servus, ich bräuchte mal eure Hilfe im Bezug auf SQL. Ich bin hier leider total ...

Microsoft Office
Excel Such- und Vergleichsfunktion
gelöst Frage von oesi1989Microsoft Office15 Kommentare

Hallo zusammen, ich habe 2 Tabellen mit Name, Vorname und Arbeitgeber. 1. Tabelle Name Vorname Geb-Datum Arbeitgeber Straße Ort ...

Neue Wissensbeiträge
Humor (lol)

"Linux und 5 Gründe Warum man kein Windows verwenden sollte sondern Ubuntu Linux"

Tipp von Snowbird vor 14 StundenHumor (lol)8 Kommentare

Gerade gefunden. Ja, ist etwas älter, aber irgendwie lustig?

Humor (lol)

"Warum Linux in einer vernetzten Welt einfach keinen Komfort bietet!"

Tipp von Snowbird vor 1 TagHumor (lol)13 Kommentare

Ein interessanter Einblick warum Linux nichts für Geräteübergreifende Arbeit ist :)

Humor (lol)
Zuviel Speicher ist ungesund. :-)
Tipp von Lochkartenstanzer vor 1 TagHumor (lol)14 Kommentare

Moin Kollegen, Heute hatte ich ein ungewöhnliches Aha-Erlebnis: Über das Wochenende habe ich einen einen 6 Jahre alten Bare-Metal ...

Windows Update

KB4517297 verfügbar, behebt Fehler in VB6 VBA VBScript

Information von sabines vor 1 TagWindows Update

Das Update behebt mögliche Fehler in VB6, VBA und VBScript, die durch das Update KB4512486 vom August entstanden sind. ...

Heiß diskutierte Inhalte
Router & Routing
Deinstalliertes Geräte wird in FritzBox noch immer als verbundenes Gerät angezeigt
gelöst Frage von imebroRouter & Routing18 Kommentare

Hallo, in meiner FritzBox 7490 wird im Bereich "Funknetz" ein Gereät bei den verbundenen Geräten angezeigt, wobei ich nicht ...

Batch & Shell
PowerShell - Text an HTMLbody übergeben mit UTF-8 Kodierung
Frage von Pat.batBatch & Shell14 Kommentare

Hallo zusammen, ich stoße momentan auf folgendes Problem. Ich möchte mit meinem Skript E-Mails versenden. Text und Signatur samt ...

Sonstige Systeme
Ist es möglich ein ISDN-Telefon an einen analogen Anschluss anzuschließen?
Frage von cramtroniSonstige Systeme14 Kommentare

Also anders herum geht es ja, da gibt es ja diese Adapter von RJ11 auf TAE-F, aber gibt es ...

Humor (lol)
Zuviel Speicher ist ungesund. :-)
Tipp von LochkartenstanzerHumor (lol)14 Kommentare

Moin Kollegen, Heute hatte ich ein ungewöhnliches Aha-Erlebnis: Über das Wochenende habe ich einen einen 6 Jahre alten Bare-Metal ...