nubbeldupp
Goto Top

Powershell - Textdatei einlesen und die ersten 5 Zeichen jeder Zeile durchsuchen

Hallo,

ich habe folgendes Problem:

Ich möchte mit Powershell eine Textdatei auslesen und eine bestimmte Zeile ausgeben lassen.
Soweit habe ich das hin bekommen, jedoch wurde mir heute ein Fehler aufgezeigt, den ich so nicht bedacht habe.

Vorab einmal das derzeitige Script und die Textdatei:

##################################################################################
# Auslesen einer Textdatei und Ausgabe eines Strings durch Eingabe eines Kürzels #
#                         Beispielformatierung der Text-Datei:                   #
#                              rofl;C:\rofl.bat                                  #
##################################################################################

#Eingabeaufforderung für das Kürzel (z.B. rofl)
$datei = Read-Host "Gesuchte Datei?: "  

#Einlesen der Datei und rausfiltern der gesuchten Zeile, die das Kürzel enthält
$datgefunden = Get-Content .\test.txt | Select-String $datei

#Aufspliten des Strings und entfernen des Kürzels
$datgeaendert = $datgefunden.ToString().Split(';')[1].Trim()  

#Ausgabe des Pfades
Write-Host " "  
Write-Host $datgeaendert
Write-Host " "  

Inhalt der Textdatei:
omg;C:\rofl.txt
rofl;C:\rol.bat
lol;C:\Dokumente und Einstellungen\dummy\lol.exe
fu;D:\Programme\fu.txt
cfg;C:\WINDOWS\system32\test.cfg

Das Script hat funktioniert, bis die Zeile "omg;C:\rofl.txt" dazu gekommen ist... Nun findet es bei der suche nach "rofl" dementschrechend 2 Ergebnisse, ich möchte aber eigentlich nur die Zeile "rofl;C:\rol.bat" finden.

Deshalb suche ich nach einer Möglichkeit entweder nur die ersten 5 Zeichen jeder Zeile zu durchsuchen, oder falls möglich bis zum Semikolon.
Am Ende sollte wie bisher als Ergebniss z.B. "C:\rol.bat" ausgegeben werden.

Danke vorab für eure Bemühungen

Grüße

Mirko

Content-Key: 177869

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

Printed on: April 26, 2024 at 14:04 o'clock

Member: Connor1980
Connor1980 Dec 19, 2011 at 10:38:56 (UTC)
Goto Top
Hi,

die ersten 5 Zeichen müssten mit ".Substring(5)" abzufragen sein. http://technet.microsoft.com/en-us/library/ee692804.aspx

Aus dem Bauch heraus ohne es getestet zu haben, würde ich das Select-String hinter die Aufsplittung setzen, da müsste genügen.

Grüße
Member: nubbeldupp
nubbeldupp Dec 19, 2011 at 11:18:24 (UTC)
Goto Top
Hi Connor1980,

vorab nochmal danke für die Antwort.

Ich habe es jetzt nicht mit einem Substring gemacht und des "select-string" hinter die Aufsplittung zu setzen hat auch nicht zum Erfolg geführt.
Aber dank deines Links bin ich zu einer anderen Lösung gekommen. face-smile

Ich habe einfach eine foreach-Schleife eingebaut in der überprüft wird, ob am Anfang der Zeile das gesuchte Kürzel steht.
Dies erfordert immer noch ein gewisses Maß an Präzsion bei der Eingabe des Kürzels (Falls es z.B. test und test_neu gibt), aber das sollte dann kein Problem mehr darstellen.

##################################################################################
# Auslesen einer Textdatei und Ausgabe eines Strings durch Eingabe eines Kürzels #
#                         Beispielformatierung der Text-Datei:                   #
#                              rofl;C:\rofl.bat                                  #
##################################################################################

#Eingabeaufforderung für das Kürzel (z.B. rofl)
$datei = Read-Host "Gesuchte Datei?: "  

#Auslesen der Datei
$datgefunden = Get-Content .\test.txt

#Leerzeile für die Übersichtlichkeit
Write-Host ""  

#Vergleich der Zeilen, ob am Anfang das gesuschte Kürzel steht und Ausgabe des Pfades
Foreach($line in $datgefunden){
if($line.StartsWith($datei)){
   $line.split(';')[1].Trim()  
   }
}

#Leerzeile für die Übersichtlichkeit
Write-Host ""  

Grüße

Mirko
Member: colinardo
colinardo Dec 19, 2011 at 11:28:21 (UTC)
Goto Top
$datei = Read-Host "Gesuchte Datei?: "   
foreach ($line in Get-Content -Path "c:\test.txt")  
{
    if ($line.Substring(0,$datei.length) -eq $datei)
    {
       Write-Host $line.Split(";")[1].Trim()  
    }
}