Benutzer mit den meisten Antworten
Gross- und Kleinschreibung ausschalten

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
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+- Als Antwort vorgeschlagen Teodora MilushevaModerator Montag, 3. November 2014 06:41
- Als Antwort markiert Teodora MilushevaModerator Mittwoch, 5. November 2014 10:08
-
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.aspxCode:
############# 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+- Als Antwort vorgeschlagen Teodora MilushevaModerator Mittwoch, 5. November 2014 10:08
- Als Antwort markiert NBC2009 Mittwoch, 5. November 2014 16:31
- Bearbeitet Peter Kriegel Donnerstag, 6. November 2014 05:50
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+- Als Antwort vorgeschlagen Teodora MilushevaModerator Montag, 3. November 2014 06:41
- Als Antwort markiert Teodora MilushevaModerator Mittwoch, 5. November 2014 10:08
-
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+ -
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.aspxCode:
############# 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+- Als Antwort vorgeschlagen Teodora MilushevaModerator Mittwoch, 5. November 2014 10:08
- Als Antwort markiert NBC2009 Mittwoch, 5. November 2014 16:31
- Bearbeitet Peter Kriegel Donnerstag, 6. November 2014 05:50