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 PowerShell Merkmale auslesen, in eine eigene Datei verschieben und aus dem orginal löschen

Mitglied: Haven205

Haven205 (Level 1) - Jetzt verbinden

25.04.2014, aktualisiert 29.04.2014, 2369 Aufrufe, 7 Kommentare, 2 Danke

Hallo zusammen,

ich als absoluter PowerShell Neuling verbringe den Vormittag damit mich einigermaßen einzulesen und versuchen, mit Hilfe von Google ein kleines Minitool zu basteln.

Die Daten bzw die Inhalte der Datenbank sind durch Semikolon getrennt sodass unsere Programme auf der Arbeit dies automatisch erkennen.
Als Beispiel:

Info1;Info2;Info3;Info4;Info5;Info6
Bildschirm;Defekt;Blau;Bezahlt;EDV;Neu
PC;Defekt;Schwarz;Ratenzahlung;EDV;Gebraucht
Tastatur;Nicht Defekt;Schwarz;Bezahlt;Support;Neu
Stift;Nicht Defekt;Blau;Bezahlt;Hotline;Neu
Telefon;Defekt;Silber;Ratenzahlung;Chef;Neu

Ziel des Tools soll es sein, die Datensätze nach bestimmten Worten in einer bestimmten Spalte zu suchen ( " Defekt" in Feld Info2 oder "Bezahlt" in Feld Info5) , diese in eine eigene Datei zu schreiben ( Defekt.txt bzw. Bezahlt.txt ) und aus der Orginaldatei zu löschen. Möglich sein soll aber auch das nach " Defekt " und " Chef " gesucht werden kann und dementsprechend eine Defekt.txt und eine Chef.txt mit den jewaligen Zeilen bzw anderen Infos gespeichert wird.

Ich habe folgende Schnipsel gefunden und einzeln geschafft sie zum laufen zu bekommen:

Dieser Teil durchsucht allerdings den kompletten String ohne auf die Begrenzer zu achten und löscht ..
01.
clear-Host 
02.
$file = Get-Content "C:\temp\test.txt" 
03.
$str | out-file C:\temp\test3.txt     
04.
foreach ($str in $file) 
05.
06.
	if ($str -like '*Hotline*') { 
07.
	} else { 
08.
	   $str | out-file C:\temp\test2.txt -append    
09.
	}	 
10.
}
Die vorhergige Auszählung die wenn möglich auch in einer eigenen .txt Datei diese Speichert:

01.
$Path="C:\temp\test2.txt" 
02.
$words="Defekt","Silber","EDV" 
03.
 
04.
foreach($word in $words){ 
05.
 $anzahl = (select-string -path $path -pattern "$word").count  
06.
  "$word $anzahl" 
07.
 }
Und zu guter letzt der Schnipsel der die gefundenen Datensätze in eigene Dateien speichert ohne allerdings diese Zeilen aus der Orginaldatei zu löschen :

01.
$Patterns = @("Peter "," uni ") 
02.
$Path = "c:\temp\test2.txt" 
03.
$OutPath="c:\temp\errors" 
04.
 
05.
Foreach($Pattern in $Patterns){ 
06.
    $OutPath="c:\temp\Sel" 
07.
    $OutPath = "$OutPath\$Pattern.log" 
08.
    $PatternLines = Select-String -path $Path -pattern $Pattern | ft LineNumber, Line -auto 
09.
    $PatternLines | Out-File -filepath $OutPath -encoding Default   

Jetzt die Frage wo ich mir von euch Hilfe erhoffe. Wie kann ich diese Code's so ineinander verschachteln das es läuft ?

Ich hoffe, die Fragestellung ist nicht zu verwirrend.

Vielen dank im Vorraus und ein schönes Wochenende aus Köln

Mitglied: colinardo
LÖSUNG 25.04.2014, aktualisiert 29.04.2014
Hallo Haven205, Willkommen im Forum.
Das ist kein Problem wenn man mit dem CMDLet Import-CSV und Export-CSV und Compare-Object arbeitet. Da du noch Powershell-Anfänger bist, ist das vermutlich erst mal starker Tobak für dich, habe dir deswegen Kommentare in den Code eingesetzt.
Beispiel-Funktion
01.
function myFilterTool{ 
02.
    # Parameter der Funktion deklarieren 
03.
    param( 
04.
        [parameter(mandatory=$true)][string]$inputFile, 
05.
        [parameter(mandatory=$true)][string]$outputFile, 
06.
        [parameter(mandatory=$true)][ValidatePattern("[^=]+=[^=]+")][string[]]$Bedingungen 
07.
08.
     
09.
    # CSV-Datei importieren 
10.
    $csv = import-csv $inputFile -Delimiter ";" 
11.
    $gefunden = $csv 
12.
 
13.
    # Bedingungen verarbeiten 
14.
    foreach($Bedingung in $Bedingungen){ 
15.
        $spalte = $Bedingung.Split("=")[0] 
16.
        $suchwort = $Bedingung.Split("=")[1] 
17.
        $gefunden = $gefunden | ?{$_."$spalte" -like "$suchwort"} 
18.
19.
 
20.
    if ($gefunden){ 
21.
        # Exportieren der gefundenen Einträge 
22.
        $gefunden | export-csv $outputFile -Delimiter ";" -NoTypeInformation 
23.
     
24.
        # gefundene Einträge aus Original-Datei eliminieren indem wir das Original-Objekt mit den gefundenen Einträgen vergleichen 
25.
        $diff = Compare -ReferenceObject $csv -DifferenceObject $gefunden | Select -ExpandProperty InputObject 
26.
        if ($diff){ 
27.
            $diff | export-csv $inputFile -Delimiter ";" -NoTypeInformation 
28.
29.
30.
31.
# Funktion aufrufen 
32.
myFilterTool -inputFile "C:\original.csv" -outputFile "C:\ausgabe.csv" -Bedingungen @("Info2=Defekt","Info4=Bezahlt")
Den Aufruf der Funktion siehst du in der letzten Zeile.
myFilterTool -inputFile "C:\original.csv" -outputFile "C:\ausgabe.csv" -Bedingungen @("Info2=Defekt","Info4=Bezahlt")
D.h. du übergibst der Funktion das File mit den Original-Daten, dem Pfad für das Ausgabe-File und dann noch ein Array mit den Bedingungen, wobei in diesen Bedingungen das Gleichheitszeichen = als Trenner zwischen Spaltenname und gesuchtem Wert fungiert. Die Bedingungen müssen alle erfüllt sein damit eine Zeile ausgewählt wird (UND-Verknüpft).

Grüße Uwe
Bitte warten ..
Mitglied: Haven205
29.04.2014 um 10:55 Uhr
Hallo Uwe,

zu allererst danke für deine Antwort.

Wir haben es mal getestet, allerdings löscht er den gefundenen Datensatz nicht aus dem Orginal sondern er wird nur in eine Ausgabe.csv kopiert.

Ist es auch möglich, da wird mit einem festen Satzaufbau ( d.h. die Abstände sind durch Leerzeichen getrennt ) von Stelle X über eine Länge von Y zu suchen?
Bitte warten ..
Mitglied: colinardo
29.04.2014, aktualisiert um 11:00 Uhr
Zitat von Haven205:
Wir haben es mal getestet, allerdings löscht er den gefundenen Datensatz nicht aus dem Orginal sondern er wird nur in eine Ausgabe.csv kopiert
Bei mir geht's hier einwandfrei ...
Ist es auch möglich, da wird mit einem festen Satzaufbau ( d.h. die Abstände sind durch Leerzeichen getrennt ) von
Stelle X über eine Länge von Y zu suchen?
alles ist möglich ...
Bitte warten ..
Mitglied: Haven205
29.04.2014 um 11:27 Uhr
Zitat von colinardo:

> Ist es auch möglich, da wird mit einem festen Satzaufbau ( d.h. die Abstände sind durch Leerzeichen getrennt ) von
> Stelle X über eine Länge von Y zu suchen?
alles ist möglich ...


Und wie sieht da der Lösungsweg aus ?
Läuft die Abfrage dann über Array's oder gibt es spezielle Befehle die von links anfangen zu lesen über eine Länge von z.B. 20 Zeichen oder von Stelle 12 bis Stelle 19?
Bitte warten ..
Mitglied: colinardo
LÖSUNG 29.04.2014, aktualisiert um 11:51 Uhr
Zitat von Haven205:
Und wie sieht da der Lösungsweg aus ?
ohne konkrete Beispieldaten ein Raten mit der Glaskugel..
Läuft die Abfrage dann über Array's oder gibt es spezielle Befehle die von links anfangen zu lesen über eine
Länge von z.B. 20 Zeichen oder von Stelle 12 bis Stelle 19?
dafür gibt es mehrere Möglichkeiten, kannst du z.B. mit der Funktion Substring $deinString.Substring(0,20) machen oder mit Regular Expressions.

Grüße Uwe
Bitte warten ..
Mitglied: Haven205
29.04.2014 um 11:51 Uhr
Ok, dank dir erstmal.

Ich werde mal versuchen wie bzw wo ich den Schnipsel in den Code integriere.

Lg
Bitte warten ..
Mitglied: colinardo
29.04.2014, aktualisiert um 12:23 Uhr
Zitat von Haven205:
Ok, dank dir erstmal.
Ich werde mal versuchen wie bzw wo ich den Schnipsel in den Code integriere.

ohne jetzt deine Quelldaten zu kennen, z.B. nach diesem Schema als Anregung (die Position Substring an der gesucht wird musst du natürlich an deine Bedürfnisse anpassen).

Das einbauen mehrerer Bedingungen habe ich dir mal als Hausaufgabe gelassen.
01.
function myFilterTool{ 
02.
    # Parameter der Funktion deklarieren 
03.
    param( 
04.
    [parameter(mandatory=$true)][string]$inputFile, 
05.
    [parameter(mandatory=$true)][string]$outputFile, 
06.
    [parameter(mandatory=$true)][string]$suchwort 
07.
08.
     
09.
    $lines = gc $inputFile 
10.
    $foundlines = $lines | ?{($_.Substring(0,10).Trim()) -Like $suchwort} 
11.
    if($foundlines){ 
12.
        $foundlines | set-content $outputFile 
13.
        write-host "Folgende Zeilen wurden gefunden und exportiert:" -ForegroundColor Green 
14.
        $foundlines 
15.
 
16.
        $diff = Compare $lines $foundlines | Select -ExpandProperty InputObject 
17.
        if ($diff){ 
18.
            $diff | Set-Content $inputFile 
19.
20.
    }else{ 
21.
        write-host "Für das Suchwort wurde kein Eintrag gefunden!" -ForegroundColor Red 
22.
23.
24.
 
25.
myFilterTool -inputFile "C:\temp\demo.csv" -outputFile "C:\temp\demo2.csv" -suchwort "Tastatur"
Grüße Uwe
Bitte warten ..
Ähnliche Inhalte
Batch & Shell
Dateien löschen und Verschieben
gelöst Frage von michi-ffmBatch & Shell10 Kommentare

Hallo Zusammen, ich bin dabei ein Skript zuschreiben, leider fehlen mir hierzu die erforderliche Kenntnisse. Ich habe folgenden Befehl: ...

Installation

Mit Powershell in einer Datei eine Zeile auslesen

gelöst Frage von Bommi1961Installation6 Kommentare

Hallo zusammen, wie bekomme ich es hin, das ich einen Bestimmt wert aus einer Zeil auslesen kann? Ich hab ...

Batch & Shell

Powershell ältere Dateien löschen

gelöst Frage von Cougar77Batch & Shell6 Kommentare

Hallo, ich habe ein kleines Problem mit einem Datenaustauschordner. Und zwar möchte ich, dass in einem Ordner Dateien 30 ...

Windows 7

Dateien kontrolliert löschen mit PowerShell

gelöst Frage von DanielBodenseeWindows 72 Kommentare

Hallo Leute, ein MSI-Installer löschten offenbar seine temporär entpackten Daten erst Sekunden nach Ende des MSI-Pakets was dann den ...

Neue Wissensbeiträge
Google Android

Googles "Android Enterprise Recommended" für Unternehmen

Information von kgborn vor 12 StundenGoogle Android3 Kommentare

Hier eine Information, die für Administratoren und Verantwortliche in Unternehmen, die für die Beschaffung und das Rollout von Android-Geräten ...

Sicherheit

Intel gibt neue Spectre V2-Microcode-Updates frei (20.02.2018)

Information von kgborn vor 12 StundenSicherheit

Intel hat zum 20. Februar 2018 weitere Microcode-Updates für OEMs freigegeben, um Systeme mit neueren Prozessoren gegen die Spectre ...

Microsoft
ARD-Doku - Das Microsoft Dilemma
Tipp von Knorkator vor 15 StundenMicrosoft3 Kommentare

Hallo zusammen, vor einigen Tagen lief in der ARD u.a. Reportage. Das Youtube Video dazu dürfte länger verfügbar sein. ...

Windows 10

Neue Sicherheitslücke in Windows 10 (Version 1709) durch Google öffentlich geworden

Information von kgborn vor 1 TagWindows 10

Vor ein paar Tagen haben Googles Sicherheitsforscher vom Projekt Zero eine Sicherheitslücke im Edge-Browser publiziert. Jetzt wurde eine weitere ...

Heiß diskutierte Inhalte
Windows Server
AD DS findet Domäne nicht, behebbar?
Frage von schapitzWindows Server40 Kommentare

Guten Tag, ich habe bei einem Kunden ein Problem mit den AD DS. Umgebung ist folgende: Windows Server 2016 ...

Router & Routing
LANCOM VPN CLIENT einrichten
Frage von Finchen961988Router & Routing27 Kommentare

Hallo, ich habe ein Problem und hoffe ihr könnt mir helfen, wir haben einen Kunden der hat einen Speedport ...

Router & Routing
ISC DHCP 2 Subnetze
gelöst Frage von janosch12Router & Routing19 Kommentare

Hallo, ich betreibe bei mir im Netzwerk einen ISC DHCP Server auf Debian, der DHCP verwaltet aktuell ein /24 ...

Switche und Hubs
Cisco SG350X-48 AdminIP in anderes VLAN
Frage von lcer00Switche und Hubs14 Kommentare

Hallo zusammen, ich habe ein Problem mir einem Cisco SG350X-48 bei der Erstinstallation wurde eine IP 192.168.0.254 (Default VLAN ...