none
Umlaute in PowerShell Script verwenden RRS feed

  • Frage

  • Moin zusammen,

    ich möchte über die Powershell eine CSV-Datei einlesen, um damit im AD Benutzerkonten anzulegen.

    So weit, so gut. Die CSV liegt im Unicode vor und Umlaute werden auch von allen möglichen Texteditoren korrekt angezeigt.Nun möchte ich aus dem Vornamen und dem Nachnamen z.B. die Mailadresse erstellen.

    Bekanntermaßen sind Umlaute sowie das "ß" in der Mailadresse nicht zugelassen.

    Ferner müssen Leerzeichen abgefangen werden.

    Folgenden Code habe ich erfolgreich erstellt (Ausschnitt):

    	# Herausfiltern und Ersetzen von Umlauten und Leerzeichen aus Nachnamen
    	$Nachname = $user.nachname.ToString()
    	if ($Nachname.contains(" "))
    	{
    	$output += "`nHinweis: Nachname enthält Umlaut ä"
    	$Nachname01 = $Nachname.replace(" ",".")
    	}
    	else
    	{
    	$Nachname01 = $Nachname
    	}
    	if ($Nachname01.contains("ö"))
    	{
    	$output += "`nHinweis: Nachname mit Umlaut"
    	$Nachname02 = $Nachname01.replace("ö","oe")
    	$output += "`nErsetzt: --> " + $Nachname02
    	}
    	else
    	{
    	$Nachname02 = $Nachname01	
    	}
    [...]

    Das Herausfiltern und Ersetzen von Leerzeichen funktioniert.

    Kommen wir aber zum Erkennen und Ersetzen von Umlauten oder dem "ß", streikt die Powershell.

    Umlaute werden einfach nicht ersetzt. Muss ich hier an entsprechender Stelle im Script Umlaute ggf. "Maskieren"?

    Bin für jeden Tipp dankbar!

    Montag, 24. Februar 2014 13:20

Antworten

  • Ich vermute, das liegt daran wie du die Datei "Replace_umlaute2.ps1" abgespeichert hast.

    Die Datei ist anscheinend NICHT im UTF-8 (Unicode) Format abgespeichert worden.

    Mit welchem Editor hat du die Datei gespeichert?

    Ich konnte das Reproduzieren! Wenn du einen Editor benutzt der die Datei Kodierung UTF-8 ohne BOM benutzt, dann hast du diese Erscheinung!

    PowerShell benötig UTF-8 mit BOM !
    BOM = Byte Order Mark siehe:

    http://de.wikipedia.org/wiki/Byte_Order_Mark

    Normalerweise erkennt die Powershell das Encoding der Datei von selbst wenn die Datei ein BOM hat, ansonsten nimmt es das Default-Encoding des Betriebsystems, welches du dir mit [System.Text.Encoding]::Default anzeigen lassen kannst, und wenn das nicht passt kommen die Umlaute nicht korrekt zur Anzeige!

    Bitte Nutze die PowerShell ISE zum bearbeiten und Speichern von PowerShell Code!

    Siehe auch hier:

    http://www.administrator.de/forum/windows-powershell-umlaute-in-dateinamen-und-pfaden-221191.html

    Unbedingt lesen

    Zeichencodierung für Anfänger:
    https://www.w3.org/International/questions/qa-what-is-encoding.de.php


    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    Dienstag, 25. Februar 2014 08:58
  • Hallo Markus!

    Nimm einfach die Funktion hier und erweitere diese auf deine Bedürfnisse:

    http://www.datenteiler.de/powershell-umlaute-ersetzen/

    Die Funktion aus dem Post ist Suboptimal ... Ich habe diese mal etwas verbessert:

    Function Replace-Umlaut { param ( [string]$Text ) # create HashTable with replace map $characterMap = @{} $characterMap.([Int][Char]'ä') = "ae" $characterMap.([Int][Char]'ö') = "oe" $characterMap.([Int][Char]'ü') = "ue" $characterMap.([Int][Char]'ß') = "ss" $characterMap.([Int][Char]'Ä') = "Ae" $characterMap.([Int][Char]'Ü') = "Ue" $characterMap.([Int][Char]'Ö') = "Oe" $characterMap.([Int][Char]' ') = "." $characterMap.([Int][Char]'á') = "_" # Replace chars
    ForEach ($key in $characterMap.Keys) { $Text = $Text -creplace ([Char]$key),$characterMap[$key] } # return result
    $Text } Replace-Umlaut "á Ökomärkte Übermäßig"



    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    Montag, 24. Februar 2014 14:11
  • Hallo,

    mir war so also ob ich auch schon mal so was gebastetlt habe mit einen anderen Loesungsansatz.

    function Replace-Umlaut {
    	param (
    		[string]$Text 
    	)
    
    	$CleanText = $Text
    	switch -regex ($text) {
    		'ä' {$CleanText = $CleanText -creplace 'ä','ae'}
    		'Ä' {$CleanText = $CleanText -creplace 'Ä','Ae'}
    		'ö' {$CleanText = $CleanText -creplace 'ö','oe'}
    		'Ö' {$CleanText = $CleanText -creplace 'Ö','Oe'}
    		'ü' {$CleanText = $CleanText -creplace 'ü','ue'}
    		'Ü' {$CleanText = $CleanText -creplace 'Ü','Ue'}
    		'ß' {$CleanText = $CleanText -creplace 'ß','ss'}
    		' ' {$CleanText = $CleanText -creplace ' ','.'}
    	}
    	$CleanText
    }
    
    Replace-Umlaut "Hans Günther Mäßig Überlingen"

    Beste Gruesse
    brima


    Montag, 24. Februar 2014 16:17
  • Hallo Markus!

    Ich nehme mal an das du mit den $Nachname01 und $Nachname02 durch einander kommst.

    Die Ersertzung muss auch immer in der selben Variable geschehen!

    Eleganter ist es dafür eine Funktion zu bauen (siehe im anderen Post Code)

    $Nachname = "Hans Günther Mäßig Überlingen"
    
    $Nachname = $Nachname.replace("ü","ue")
    $Nachname = $Nachname.replace("Ü","Ue")
    $Nachname = $Nachname.replace("ö","oe")
    $Nachname = $Nachname.replace("Ö","Oe")
    $Nachname = $Nachname.replace("ä","ae")
    $Nachname = $Nachname.replace("Ä","Ae")
    $Nachname = $Nachname.replace("ß","ss")
    $Nachname = $Nachname.replace(" ",".")
    
    $Nachname

    Deine If(ö) abfragen ob ein Buchstabe Vorkommt sind unnötig, wenn du allerdings die Meldungen haben willst musst du Sie wieder einbauen.

    Dafür eignet sich die Switch Lösung von Brima!:

    $Name = "Hans Günther Mäßig Überlingen"	
    
    switch -regex ($Name) {
    	'ä' {
                    Write-Host "Hinweis: Nachname enthält Umlaut ä"
                    $Name = $Name -creplace 'ä','ae'
    } 'Ä' { Write-Host "Hinweis: Nachname enthält Umlaut Ä" $Name = $Name -creplace 'Ä','Ae'
    } 'ö' { Write-Host "Hinweis: Nachname enthält Umlaut ö" $Name = $Name -creplace 'ö','oe'
    } 'Ö' { Write-Host "Hinweis: Nachname enthält Umlaut Ö" $Name = $Name -creplace 'Ö','Oe'
    } 'ü' { Write-Host "Hinweis: Nachname enthält Umlaut ü" $Name = $Name -creplace 'ü','ue'
    } 'Ü' { Write-Host "Hinweis: Nachname enthält Umlaut Ü" $Name = $Name -creplace 'Ü','Ue'
    } 'ß' { Write-Host "Hinweis: Nachname enthält Umlaut ß" $Name = $Name -creplace 'ß','ss'
    } ' ' { Write-Host "Hinweis: Nachname enthält Leerzeichen" $Name = $Name -creplace ' ','.'
    } } $Name


    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    Montag, 24. Februar 2014 17:20

Alle Antworten

  • Hallo Markus!

    Nimm einfach die Funktion hier und erweitere diese auf deine Bedürfnisse:

    http://www.datenteiler.de/powershell-umlaute-ersetzen/

    Die Funktion aus dem Post ist Suboptimal ... Ich habe diese mal etwas verbessert:

    Function Replace-Umlaut { param ( [string]$Text ) # create HashTable with replace map $characterMap = @{} $characterMap.([Int][Char]'ä') = "ae" $characterMap.([Int][Char]'ö') = "oe" $characterMap.([Int][Char]'ü') = "ue" $characterMap.([Int][Char]'ß') = "ss" $characterMap.([Int][Char]'Ä') = "Ae" $characterMap.([Int][Char]'Ü') = "Ue" $characterMap.([Int][Char]'Ö') = "Oe" $characterMap.([Int][Char]' ') = "." $characterMap.([Int][Char]'á') = "_" # Replace chars
    ForEach ($key in $characterMap.Keys) { $Text = $Text -creplace ([Char]$key),$characterMap[$key] } # return result
    $Text } Replace-Umlaut "á Ökomärkte Übermäßig"



    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    Montag, 24. Februar 2014 14:11
  • Hallo,

    mir war so also ob ich auch schon mal so was gebastetlt habe mit einen anderen Loesungsansatz.

    function Replace-Umlaut {
    	param (
    		[string]$Text 
    	)
    
    	$CleanText = $Text
    	switch -regex ($text) {
    		'ä' {$CleanText = $CleanText -creplace 'ä','ae'}
    		'Ä' {$CleanText = $CleanText -creplace 'Ä','Ae'}
    		'ö' {$CleanText = $CleanText -creplace 'ö','oe'}
    		'Ö' {$CleanText = $CleanText -creplace 'Ö','Oe'}
    		'ü' {$CleanText = $CleanText -creplace 'ü','ue'}
    		'Ü' {$CleanText = $CleanText -creplace 'Ü','Ue'}
    		'ß' {$CleanText = $CleanText -creplace 'ß','ss'}
    		' ' {$CleanText = $CleanText -creplace ' ','.'}
    	}
    	$CleanText
    }
    
    Replace-Umlaut "Hans Günther Mäßig Überlingen"

    Beste Gruesse
    brima


    Montag, 24. Februar 2014 16:17
  • Hallo Brima !

    Die Zwischenvariable $CleanTextund der Switchblock sind überflüssig !

    Function Replace-Umlaut {
    	param (
    		[string]$Text 
    	)
    
    		$Text = $Text -creplace 'ä','ae'
    		$Text = $Text -creplace 'Ä','Ae'
    		$Text = $Text -creplace 'ö','oe'
    		$Text = $Text -creplace 'Ö','Oe'
    		$Text = $Text -creplace 'ü','ue'
    		$Text = $Text -creplace 'Ü','Ue'
    		$Text = $Text -creplace 'ß','ss'
    		$Text = $Text -creplace ' ','.'
    
    	$Text
    }
    
    Replace-Umlaut "Hans Günther Mäßig Überlingen"


    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    Montag, 24. Februar 2014 16:50
  • Hallo Markus!

    Ich nehme mal an das du mit den $Nachname01 und $Nachname02 durch einander kommst.

    Die Ersertzung muss auch immer in der selben Variable geschehen!

    Eleganter ist es dafür eine Funktion zu bauen (siehe im anderen Post Code)

    $Nachname = "Hans Günther Mäßig Überlingen"
    
    $Nachname = $Nachname.replace("ü","ue")
    $Nachname = $Nachname.replace("Ü","Ue")
    $Nachname = $Nachname.replace("ö","oe")
    $Nachname = $Nachname.replace("Ö","Oe")
    $Nachname = $Nachname.replace("ä","ae")
    $Nachname = $Nachname.replace("Ä","Ae")
    $Nachname = $Nachname.replace("ß","ss")
    $Nachname = $Nachname.replace(" ",".")
    
    $Nachname

    Deine If(ö) abfragen ob ein Buchstabe Vorkommt sind unnötig, wenn du allerdings die Meldungen haben willst musst du Sie wieder einbauen.

    Dafür eignet sich die Switch Lösung von Brima!:

    $Name = "Hans Günther Mäßig Überlingen"	
    
    switch -regex ($Name) {
    	'ä' {
                    Write-Host "Hinweis: Nachname enthält Umlaut ä"
                    $Name = $Name -creplace 'ä','ae'
    } 'Ä' { Write-Host "Hinweis: Nachname enthält Umlaut Ä" $Name = $Name -creplace 'Ä','Ae'
    } 'ö' { Write-Host "Hinweis: Nachname enthält Umlaut ö" $Name = $Name -creplace 'ö','oe'
    } 'Ö' { Write-Host "Hinweis: Nachname enthält Umlaut Ö" $Name = $Name -creplace 'Ö','Oe'
    } 'ü' { Write-Host "Hinweis: Nachname enthält Umlaut ü" $Name = $Name -creplace 'ü','ue'
    } 'Ü' { Write-Host "Hinweis: Nachname enthält Umlaut Ü" $Name = $Name -creplace 'Ü','Ue'
    } 'ß' { Write-Host "Hinweis: Nachname enthält Umlaut ß" $Name = $Name -creplace 'ß','ss'
    } ' ' { Write-Host "Hinweis: Nachname enthält Leerzeichen" $Name = $Name -creplace ' ','.'
    } } $Name


    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    Montag, 24. Februar 2014 17:20
  • Hallo Peter,

    jetzt wollte ich gerade was zum Switch und den beiden Variablen schreiben, aber das hat sich ja mit deinem neuen Post eruebrigt. :-)

    Beste Gruesse
    brima

    Montag, 24. Februar 2014 17:36
  • Erst Mal Danke an Euch alle!

    Ich habe mal das Codebeispiel von Peter aufgenommen und etwas erweitert, um einen Vorher/Nachher Vergleich zu haben:

    Function Replace-Umlaute {
    
        param (
           [string]$Text 
        )
     
        # hash tables are by default case insensitive
        # we have to create a new hash table object for case sensitivity 
        $characterMap = New-Object System.Collections.HashTable
        $characterMap.ä = "ae"
        $characterMap.ö = "oe"
        $characterMap.ü = "ue"
        $characterMap.ß = "ss"
        $characterMap.Ä = "Ae"
        $characterMap.Ü = "Ue"
        $characterMap.Ö = "Oe"
        $characterMap.' ' = "." # Leerzeichen durch einen Punkt ersetzen
        
        foreach ($key in $characterMap.Keys) {
            $Text = $Text -creplace $key,$characterMap[$key] 
        }
     
        $Text
    }
    
    
    $myString = "Übermäßiger Ökowahn"
     
    $NewString = Replace-Umlaute $myString
    
    Echo $MyString
    Echo $NewString

    Dabei ergibt sich aber bei der Ausführung in der Powershell folgende Fehlermeldung:

    Unerwartetes Token "¤" im Ausdruck oder in der Anweisung.
    Bei U:\Projekte\AD-Restrukturierung\Exporte_CPILECK\create_ad_users\Replace_umlaute.ps1:10 Zeichen:21
    +     $characterMap.ä <<<<  = "ae"
        + CategoryInfo          : ParserError: (¤:String) [], ParseException
        + FullyQualifiedErrorId : UnexpectedToken

    Auch in meinen vorangegangenen Scripten scheitert der Parser offensichtlich grundsätzlich an den großen Umlauten.

    Dienstag, 25. Februar 2014 07:10
  • So, weiteres Testergebnis mit folgendem Code:

    Function Replace-Umlaut {
    	param (
    		[string]$Text 
    	)
    
    		$Text = $Text -creplace 'ä','ae'
    		$Text = $Text -creplace 'Ä','Ae'
    		$Text = $Text -creplace 'ö','oe'
    		$Text = $Text -creplace 'Ö','Oe'
    		$Text = $Text -creplace 'ü','ue'
    		$Text = $Text -creplace 'Ü','Ue'
    		$Text = $Text -creplace 'ß','ss'
    		$Text = $Text -creplace ' ','.'
    
    	$Text
    }
    $MyString = "Hans Günther Mäßig Überlingen"
    Write-Host $Mystring
    $MyString = Replace-Umlaut $MyString
    Write-Host $MyString

    Hier kommt keine Fehlermeldung, aber die Vorher-Nachher-Ausgabe sieht verdächtig aus:

    PS U:\Projekte\AD-Restrukturierung\Exporte_CPILECK\create_ad_users> .\Replace_umlaute2.ps1
    Hans Günther Mäßig Überlingen
    Hans.Guenther.Maessig.Ueberlingen

    Es schaut so aus, als ob die Powershell selbst nicht so ganz mit Umlauten zurechtkommt...

    Dienstag, 25. Februar 2014 07:23
  • Ich vermute, das liegt daran wie du die Datei "Replace_umlaute2.ps1" abgespeichert hast.

    Die Datei ist anscheinend NICHT im UTF-8 (Unicode) Format abgespeichert worden.

    Mit welchem Editor hat du die Datei gespeichert?

    Ich konnte das Reproduzieren! Wenn du einen Editor benutzt der die Datei Kodierung UTF-8 ohne BOM benutzt, dann hast du diese Erscheinung!

    PowerShell benötig UTF-8 mit BOM !
    BOM = Byte Order Mark siehe:

    http://de.wikipedia.org/wiki/Byte_Order_Mark

    Normalerweise erkennt die Powershell das Encoding der Datei von selbst wenn die Datei ein BOM hat, ansonsten nimmt es das Default-Encoding des Betriebsystems, welches du dir mit [System.Text.Encoding]::Default anzeigen lassen kannst, und wenn das nicht passt kommen die Umlaute nicht korrekt zur Anzeige!

    Bitte Nutze die PowerShell ISE zum bearbeiten und Speichern von PowerShell Code!

    Siehe auch hier:

    http://www.administrator.de/forum/windows-powershell-umlaute-in-dateinamen-und-pfaden-221191.html

    Unbedingt lesen

    Zeichencodierung für Anfänger:
    https://www.w3.org/International/questions/qa-what-is-encoding.de.php


    PowerShell Artikel, Buchtipps und kostenlose PowerShell Tutorials + E-Books
    auf der deutschsprachigen PowerShell Community

    Mein 21 Teiliger PowerShell Video Grundlehrgang
    Deutsche PowerShell Videos auf Youtube
    Folge mir auf:
    Twitter | Facebook | Google+

    Dienstag, 25. Februar 2014 08:58
  • Markus, hast du noch Fragen zu diesem Thema? Falls nicht markiere bitte die entsprechenden Beiträge als Antwort. Warum? Siehe hier.

    Danke, Denniver


    Blog: http://bytecookie.wordpress.com
    Powershell Codesnippet Manager: Link

    Hilf mit und markiere hilfreiche Beiträge mit dem "Abstimmen"-Button (links) und Beiträge die eine Frage von dir beantwortet haben, als "Antwort" (unten).
    Warum das Ganze? Hier gibts die Antwort.

    Donnerstag, 27. Februar 2014 17:01
    Moderator
  • Sorry, hat sich scripttechnisch alles erledigt.

    Danke für Eure Hilfe!

    Mittwoch, 21. Mai 2014 13:59