none
Gross- und Kleinschreibung ausschalten RRS feed

  • Frage

  • Hallo,

    ich brauche mal etwas Hilfe. In einem PS-Script lesen ich Daten aus verschiedenen Quellen aus. Die eingelesenen Daten können man groß und mal kleingeschrieben sein. Wenn ich jetzt den Befehl Trim nutze, dann wird auf groß- und Kleinschreibung geachtet. Entsprechend wird nicht alles abgeschnitten was ich eigentlich abgeschnitten haben möchte. Als keines Beispiel:

    $Computername = "Client_001"
    $Computername2 = "client_001"
    $Text = "Mein Computer ist schlau "
    $_neu = $Text + $Computername
    $_neu
    $Text_001 = $_neu.Trim($Computername2)
    $Text_001

    Gibt es eine Möglichkeit wie ich das beachten von groß- und Kleinschreibung ausschalten kann?

    Liebe Grüße und vielen Dank für eure Hilfe

    Norbert



    IT Berater

    Freitag, 31. Oktober 2014 14:12

Antworten

  • Ja, leider sind die Methoden von der System.String Klasse case sensitive.
    Du könntest mit String.ToUpper() und String.ToLower() arbeiten , aber das zerstört die gesamte schreib weise.

    hier empfehle ich dir Regular Expression (RegEx)!
    -replace benutzt RegEx:

    $Computername = "Client_001"
    $Computername2 = "client_001"
    $Text = " Mein Computer ist schlau "
    $_neu = $Computername + $Text + $Computername + $Text + $Computername 
    
    # Leerzeichen am Anfang und Ende entfernen falls welche da sind
    $_neu = $_neu.Trim()
    
    $_neu
    
    # ersetzt am ende des Strings
    $_neu = $_neu -replace "$Computername2\Z"
    
    $_neu
    
    # ersetzt am anfang des Strings
    $_neu -replace "\A$Computername2"
    
    $_neu =  $_neu


    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+

    Freitag, 31. Oktober 2014 15:21
  • Hallo Norbert!

    Bitte versuche in Foren immer etwas mehr Informationen zu geben, das erspart uns viel Zeit und herum gerate.
    Ich kann wieder nur Raten wie du das meinst!
    In diesem Fall wäre es Hilfreich wenn du die Ausgangssituation beschreibst und welches Endergebnis du haben möchtest.

    'cmdb:\\root\Computer\Client001'

    Soll also zum Schluss so aussehen?

    'root\Computer'

    Dazu musst du dich mit Escape Zeichen in Regulären ausdrücken auskennen.

    Reguläre Ausdrücke (RegEx) sind Texzeichenfolgen die ein Suchmuster darstellen.
    RegEx benutzen einzelne oder zusammengesetzte Zeichen (Buchstaben) um das verhalten für das Suchmuster zu steuern.  

    Der zurück gelehnte Schrägstrich \ (Englisch: ‚backslash‘)  in einem regulären Ausdruck (RegEx) ist so ein Sonderzeichen. Der backslash hat die Funktioniert als Maskierungszeichen in RegEx ausdrücken.

    Maskierungszeichen oder Fluchtsymbol, (Englisch: ‚escape character‘ kurz auch nur ‚escape‘ genannt), ist ein bestimmtes Zeichen, das verhindert, dass das nachfolgende Zeichen vom einem regulären Ausdruck als Funktionszeichen erkannt wird.
    Das Plus Zeichen + ist in RegEx auch ein Sonderzeichen, A+ z.B. bedeutet, dass der Buchstabe A einmal oder mehrmals an dieser Stelle vorkommen kann (Groß- und Kleinschreibung wird hier beachtet!).
    Wenn man Plus Zeichen aber selbst im Text suchen möchte, so muss man die Sonderfunktion des Plus Zeichen + abschalten.
    Dies macht ein vorangestellte backslash.
    Im  folgenden Beispiel wird das Plus Zeichen selbst gesucht und die Sonderfunktion ist durch den backslash ‚Maskiert‘:
    A\+

    Wenn man in RegEx die Funktion des backslash selbst abschalten will, so muss der backslash mit dem backslash Maskiert werden. Etwa so: \\.

    Es gibt in regulären Ausdrücken (RegEx) noch viel mehr Sonderzeichen, da muss man sich mit der Syntax für reguläre Ausdrücke beschäftigen.
    Eine gute Übersicht der .NET RegEx in Deutsch, gibt es hier im Microsoft Developer Network:

    Sprachelemente für reguläre Ausdrücke – Kurzübersicht
    http://msdn.microsoft.com/de-de/library/az24scfc%28v=vs.110%29.aspx

    Alles auf einem Din A4-Blatt findet man in Englisch hier:

    Regular Expressions Cheat Sheet by DaveChild
    http://www.cheatography.com/davechild/cheat-sheets/regular-expressions/
    (dort den Download Link suchen!)


    Um die meisten Sonderzeichen alle auf einmal zu Maskieren benutzt man die Methode Escape() von der  .NET Klasse System.Text.RegularExpressions.RegEx.

    Ich persönlich bin kein RegEx Experte, deshalb würde ich deine Ersetzung in 2 Schritten machen:


    Es gibt im Internet sehr viel gute Schnellanleitungen für Regular Expression (RegEx).
    Hier ist eine gute in Deutsch:

    Schritt-für-Schritt zu eigenen Regulären Ausdrücken
    http://www.regenechsen.de/phpwcms/index.php?regex_allg

    Tutorial Reguläre Ausdrücke
    https://www.danielfett.de/internet-und-opensource,artikel,regulaere-ausdruecke

    Wie man mit PowerShell Reguläre Ausdrücke macht hat Tobias Weltner in Englisch hier veröffentlicht:

    Chapter 13. Text and Regular Expressions
    http://powershell.com/cs/blogs/ebookv2/archive/2012/03/20/chapter-13-text-and-regular-expressions.aspx

    Code:

    ############# Version 1 mit dem Operator -Replace #################
    
    # Text der zu bearbeiten ist
    $Text = 'cmdb:\\root\Computer\Client001'
    
    # Sonderzeichen Maskieren und Ersetzungstext festlegen
    $Replace1 = [System.Text.RegularExpressions.RegEx]::Escape('cmdb:\\')
    $Replace2 =  [System.Text.RegularExpressions.RegEx]::Escape('\' + 'Client001')
    
    # am Anfang des String (Steuerzeichen \A) den Text 'cmdb:\\' entfernen
    $Text = $Text -Replace "\A$Replace1"
    
    # am Ende des String (Steuerzeichen \A) den Text '\Client001' entfernen
    $Text = $Text -Replace "$Replace2\Z"
    
    # Ausgabe des Ergebnisses
    $Text
    
    ############# Version 2 mit dem Operator -Match #################
    
    # Um alles zusammen in einem -Match schritt zu machen,
    # muss man mit den Runden Klammern () Gruppen erstellen.
    # Und dann erscheint das Ergebnis in der Automatisch generierten Variable $Matches
    
    # Text der zu bearbeiten ist
    $Text = 'cmdb:\\root\Computer\Client001'
    
    # Sonderzeichen Maskieren und Ersetzungstext festlegen
    $Replace1 = [System.Text.RegularExpressions.RegEx]::Escape('cmdb:\\')
    $Replace2 =  [System.Text.RegularExpressions.RegEx]::Escape('\' + 'Client001')
    
    # mit dem Operator -Match den Text in Gruppen zerlegen
    # die ausgabe von $True oder $False wird durch die Zuweisung von $Null unterdrückt
    # Die Gruppe (.*) bedeutet, beliebige Zeichen können 0 oder mehrmals vorkommen (wirkt wie der * in dem -Like Operator)
    $Null = $Text -match "(\A$Replace1)(.*)($Replace2\Z)"
    
    # das Ergebnis erscheint in der Automatisch generierten Variable $Matches
    $Matches
    
    # Ausgabe des Ergebnisses befindet sich in der Gruppe mit dem Index 1!
    $matches[1]
    
    
    ############# Version 3 mit dem Operator -Match #################
    
    # Um alles zusammen in einem -Match schritt zu machen,
    # muss man mit den Runden Klammern () Gruppen erstellen.
    # Und dann erscheint das Ergebnis in der Automatisch generierten Variable $Matches
    
    # Text der zu bearbeiten ist
    $Text = 'cmdb:\\root\Computer\Client001'
    
    # Sonderzeichen Maskieren und Ersetzungstext festlegen
    $Replace1 = [System.Text.RegularExpressions.RegEx]::Escape('cmdb:\\')
    $Replace2 =  [System.Text.RegularExpressions.RegEx]::Escape('\' + 'Client001')
    
    # mit dem Operator -Match den Text in Gruppen zerlegen
    # die Ausgabe von $True oder $False wird durch die Zuweisung von $Null unterdrückt
    # Die Gruppe (.*) bedeutet, beliebige Zeichen können 0 oder mehrmals vorkommen (wirkt wie der * in dem -Like Opererator)
    # mit dem Fragezeichen und dem Doppelpunkt ?: kann man verhindern das eine Gruppe im Ergebnis erscheint.
    $Null = $Text -match "(?:\A$Replace1)(.*)(?:$Replace2\Z)"
    
    # das Ergebnis erscheint in der Automatisch generierten Variable $Matches
    # hier befinden sich nur noch 2 Gruppen 
    $Matches
    
    # Ausgabe des Ergebnisses befindet sich immer in der Gruppe mit dem Index 1,
    # weil wir nur noch eine Gruppe als Ergebnis haben
    $matches[1]
    Ab hier musst du selber laufen ;-)

       

    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, 4. November 2014 07:58

Alle Antworten

  • Ja, leider sind die Methoden von der System.String Klasse case sensitive.
    Du könntest mit String.ToUpper() und String.ToLower() arbeiten , aber das zerstört die gesamte schreib weise.

    hier empfehle ich dir Regular Expression (RegEx)!
    -replace benutzt RegEx:

    $Computername = "Client_001"
    $Computername2 = "client_001"
    $Text = " Mein Computer ist schlau "
    $_neu = $Computername + $Text + $Computername + $Text + $Computername 
    
    # Leerzeichen am Anfang und Ende entfernen falls welche da sind
    $_neu = $_neu.Trim()
    
    $_neu
    
    # ersetzt am ende des Strings
    $_neu = $_neu -replace "$Computername2\Z"
    
    $_neu
    
    # ersetzt am anfang des Strings
    $_neu -replace "\A$Computername2"
    
    $_neu =  $_neu


    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+

    Freitag, 31. Oktober 2014 15:21
  • Hallo Peter,

    vielen Dank. Das hilft mir sehr weiter. Eine Frage habe ich noch. Wenn ich einen String habe, der so aussieht:

    cmdb:\\root\Computer\Client001

    Wie bekomme ich dann dieses Zeichen "\" weg?

    Liebe Grüße

    Norbert


    IT Berater

    Montag, 3. November 2014 15:03
  • Verstehe deine Frage nicht!

    So?

    'cmdb:\\root\Computer\Client001' -replace '\\'
    # ergibt:
    # cmdb:rootComputerClient001


    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, 3. November 2014 15:17
  • fast.

    Ist möchte den Computernamen und das Zeichen \ davor entfernen sowie cmdb:\\

    'cmdb:\\root\Computer\Client001'

    Bis jetzt entferne ich die Angang "cmdb:\\" mit:

    .Remove(0,12)

    


    IT Berater

    Montag, 3. November 2014 16:20
  • Hallo Norbert!

    Bitte versuche in Foren immer etwas mehr Informationen zu geben, das erspart uns viel Zeit und herum gerate.
    Ich kann wieder nur Raten wie du das meinst!
    In diesem Fall wäre es Hilfreich wenn du die Ausgangssituation beschreibst und welches Endergebnis du haben möchtest.

    'cmdb:\\root\Computer\Client001'

    Soll also zum Schluss so aussehen?

    'root\Computer'

    Dazu musst du dich mit Escape Zeichen in Regulären ausdrücken auskennen.

    Reguläre Ausdrücke (RegEx) sind Texzeichenfolgen die ein Suchmuster darstellen.
    RegEx benutzen einzelne oder zusammengesetzte Zeichen (Buchstaben) um das verhalten für das Suchmuster zu steuern.  

    Der zurück gelehnte Schrägstrich \ (Englisch: ‚backslash‘)  in einem regulären Ausdruck (RegEx) ist so ein Sonderzeichen. Der backslash hat die Funktioniert als Maskierungszeichen in RegEx ausdrücken.

    Maskierungszeichen oder Fluchtsymbol, (Englisch: ‚escape character‘ kurz auch nur ‚escape‘ genannt), ist ein bestimmtes Zeichen, das verhindert, dass das nachfolgende Zeichen vom einem regulären Ausdruck als Funktionszeichen erkannt wird.
    Das Plus Zeichen + ist in RegEx auch ein Sonderzeichen, A+ z.B. bedeutet, dass der Buchstabe A einmal oder mehrmals an dieser Stelle vorkommen kann (Groß- und Kleinschreibung wird hier beachtet!).
    Wenn man Plus Zeichen aber selbst im Text suchen möchte, so muss man die Sonderfunktion des Plus Zeichen + abschalten.
    Dies macht ein vorangestellte backslash.
    Im  folgenden Beispiel wird das Plus Zeichen selbst gesucht und die Sonderfunktion ist durch den backslash ‚Maskiert‘:
    A\+

    Wenn man in RegEx die Funktion des backslash selbst abschalten will, so muss der backslash mit dem backslash Maskiert werden. Etwa so: \\.

    Es gibt in regulären Ausdrücken (RegEx) noch viel mehr Sonderzeichen, da muss man sich mit der Syntax für reguläre Ausdrücke beschäftigen.
    Eine gute Übersicht der .NET RegEx in Deutsch, gibt es hier im Microsoft Developer Network:

    Sprachelemente für reguläre Ausdrücke – Kurzübersicht
    http://msdn.microsoft.com/de-de/library/az24scfc%28v=vs.110%29.aspx

    Alles auf einem Din A4-Blatt findet man in Englisch hier:

    Regular Expressions Cheat Sheet by DaveChild
    http://www.cheatography.com/davechild/cheat-sheets/regular-expressions/
    (dort den Download Link suchen!)


    Um die meisten Sonderzeichen alle auf einmal zu Maskieren benutzt man die Methode Escape() von der  .NET Klasse System.Text.RegularExpressions.RegEx.

    Ich persönlich bin kein RegEx Experte, deshalb würde ich deine Ersetzung in 2 Schritten machen:


    Es gibt im Internet sehr viel gute Schnellanleitungen für Regular Expression (RegEx).
    Hier ist eine gute in Deutsch:

    Schritt-für-Schritt zu eigenen Regulären Ausdrücken
    http://www.regenechsen.de/phpwcms/index.php?regex_allg

    Tutorial Reguläre Ausdrücke
    https://www.danielfett.de/internet-und-opensource,artikel,regulaere-ausdruecke

    Wie man mit PowerShell Reguläre Ausdrücke macht hat Tobias Weltner in Englisch hier veröffentlicht:

    Chapter 13. Text and Regular Expressions
    http://powershell.com/cs/blogs/ebookv2/archive/2012/03/20/chapter-13-text-and-regular-expressions.aspx

    Code:

    ############# Version 1 mit dem Operator -Replace #################
    
    # Text der zu bearbeiten ist
    $Text = 'cmdb:\\root\Computer\Client001'
    
    # Sonderzeichen Maskieren und Ersetzungstext festlegen
    $Replace1 = [System.Text.RegularExpressions.RegEx]::Escape('cmdb:\\')
    $Replace2 =  [System.Text.RegularExpressions.RegEx]::Escape('\' + 'Client001')
    
    # am Anfang des String (Steuerzeichen \A) den Text 'cmdb:\\' entfernen
    $Text = $Text -Replace "\A$Replace1"
    
    # am Ende des String (Steuerzeichen \A) den Text '\Client001' entfernen
    $Text = $Text -Replace "$Replace2\Z"
    
    # Ausgabe des Ergebnisses
    $Text
    
    ############# Version 2 mit dem Operator -Match #################
    
    # Um alles zusammen in einem -Match schritt zu machen,
    # muss man mit den Runden Klammern () Gruppen erstellen.
    # Und dann erscheint das Ergebnis in der Automatisch generierten Variable $Matches
    
    # Text der zu bearbeiten ist
    $Text = 'cmdb:\\root\Computer\Client001'
    
    # Sonderzeichen Maskieren und Ersetzungstext festlegen
    $Replace1 = [System.Text.RegularExpressions.RegEx]::Escape('cmdb:\\')
    $Replace2 =  [System.Text.RegularExpressions.RegEx]::Escape('\' + 'Client001')
    
    # mit dem Operator -Match den Text in Gruppen zerlegen
    # die ausgabe von $True oder $False wird durch die Zuweisung von $Null unterdrückt
    # Die Gruppe (.*) bedeutet, beliebige Zeichen können 0 oder mehrmals vorkommen (wirkt wie der * in dem -Like Operator)
    $Null = $Text -match "(\A$Replace1)(.*)($Replace2\Z)"
    
    # das Ergebnis erscheint in der Automatisch generierten Variable $Matches
    $Matches
    
    # Ausgabe des Ergebnisses befindet sich in der Gruppe mit dem Index 1!
    $matches[1]
    
    
    ############# Version 3 mit dem Operator -Match #################
    
    # Um alles zusammen in einem -Match schritt zu machen,
    # muss man mit den Runden Klammern () Gruppen erstellen.
    # Und dann erscheint das Ergebnis in der Automatisch generierten Variable $Matches
    
    # Text der zu bearbeiten ist
    $Text = 'cmdb:\\root\Computer\Client001'
    
    # Sonderzeichen Maskieren und Ersetzungstext festlegen
    $Replace1 = [System.Text.RegularExpressions.RegEx]::Escape('cmdb:\\')
    $Replace2 =  [System.Text.RegularExpressions.RegEx]::Escape('\' + 'Client001')
    
    # mit dem Operator -Match den Text in Gruppen zerlegen
    # die Ausgabe von $True oder $False wird durch die Zuweisung von $Null unterdrückt
    # Die Gruppe (.*) bedeutet, beliebige Zeichen können 0 oder mehrmals vorkommen (wirkt wie der * in dem -Like Opererator)
    # mit dem Fragezeichen und dem Doppelpunkt ?: kann man verhindern das eine Gruppe im Ergebnis erscheint.
    $Null = $Text -match "(?:\A$Replace1)(.*)(?:$Replace2\Z)"
    
    # das Ergebnis erscheint in der Automatisch generierten Variable $Matches
    # hier befinden sich nur noch 2 Gruppen 
    $Matches
    
    # Ausgabe des Ergebnisses befindet sich immer in der Gruppe mit dem Index 1,
    # weil wir nur noch eine Gruppe als Ergebnis haben
    $matches[1]
    Ab hier musst du selber laufen ;-)

       

    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, 4. November 2014 07:58
  • Vielen Dank, dass hat mehr sehr geholfen.

    IT Berater

    Mittwoch, 5. November 2014 16:31