2011-10-20 13 views
7

Mam skrypt, który tworzy użytkowników w Microsoft Exchange Server i Active Directory. Tak więc, chociaż jest to zrozumiałe, że nazwy użytkowników mają akcenty lub - w Hiszpanii, chcę ich uniknąć, aby nazwa użytkownika nie powodowała żadnych niezgodności w starych systemach.Jak usunąć akcenty w PowerShell?

Jak więc wyczyścić ciąg znaków w ten sposób?

$name = "Ramón" 

Być taki? :

$name = "Ramon" 

Odpowiedz

6

Cóż mogę pomóc z niektórych kodu .....

użyłem tego ostatnio w aC# projekt rozebrać z adresami e-mail:

static string RemoveDiacritics(string stIn) 
    { 
     string stFormD = (stIn ?? string.Empty).Normalize(NormalizationForm.FormD); 
     StringBuilder sb = new StringBuilder(); 

     for (int ich = 0; ich < stFormD.Length; ich++) 
     { 
      UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(stFormD[ich]); 
      if (uc != UnicodeCategory.NonSpacingMark) 
      { 
       sb.Append(stFormD[ich]); 
      } 
     } 

     return (sb.ToString().Normalize(NormalizationForm.FormC)); 
    } 

Chyba Mogę teraz powiedzieć "rozszerzenie do skryptu PowerShell/formularza pozostawia się czytelnikowi" .... mam nadzieję, że pomaga ....

+0

+1 Inteligentne fragment, I konwertowane go do PowerShell, że działa zgodnie z oczekiwaniami dzięki. – JPBlanc

+0

Działa bardzo dobrze w PowerShell. Naprawdę dziękuję za udostępnienie: D –

17

Jak na odpowiedź ip, tutaj jest wersja Powershell.

function Remove-Diacritics { 
param ([String]$src = [String]::Empty) 
    $normalized = $src.Normalize([Text.NormalizationForm]::FormD) 
    $sb = new-object Text.StringBuilder 
    $normalized.ToCharArray() | % { 
    if([Globalization.CharUnicodeInfo]::GetUnicodeCategory($_) -ne [Globalization.UnicodeCategory]::NonSpacingMark) { 
     [void]$sb.Append($_) 
    } 
    } 
    $sb.ToString() 
} 

# Test data 
@("Rhône", "Basíl", "Åbo", "", "Gräsäntörmä") | % { Remove-Diacritics $_ } 

wyjściowa:

Rhone 
Basil 
Abo 

Grasantorma 
5

Innym tłumaczenie PowerShell z @ip dla niezarejestrowanych programistów C#; o)

function Remove-Diacritics 
{ 
    param ([String]$sToModify = [String]::Empty) 

    foreach ($s in $sToModify) # Param may be a string or a list of strings 
    { 
    if ($sToModify -eq $null) {return [string]::Empty} 

    $sNormalized = $sToModify.Normalize("FormD") 

    foreach ($c in [Char[]]$sNormalized) 
    { 
     $uCategory = [System.Globalization.CharUnicodeInfo]::GetUnicodeCategory($c) 
     if ($uCategory -ne "NonSpacingMark") {$res += $c} 
    } 

    return $res 
    } 
} 

Clear-Host 
$name = "Un été de Raphaël" 
Write-Host (Remove-Diacritics $name) 
$test = ("äâûê", "éèà", "ùçä") 
$test | % {Remove-Diacritics $_} 
Remove-Diacritics $test 
2

Innym rozwiązaniem ... szybko "ponowne użycie" twój C# w PowerShell (Kredyty z kodu C# zagubione gdzieś w sieci).

Add-Type -TypeDefinition @" 
    using System.Text; 
    using System.Globalization; 

    public class Utils 
    { 
     public static string RemoveDiacritics(string stIn) 
     { 
      string stFormD = stIn.Normalize(NormalizationForm.FormD); 
      StringBuilder sb = new StringBuilder(); 

      for (int ich = 0; ich < stFormD.Length; ich++) 
      { 
       UnicodeCategory uc = CharUnicodeInfo.GetUnicodeCategory(stFormD[ich]); 
       if (uc != UnicodeCategory.NonSpacingMark) 
       { 
        sb.Append(stFormD[ich]); 
       } 
      } 
      return (sb.ToString().Normalize(NormalizationForm.FormC)); 
     } 
    } 
"@ | Out-Null 

[Utils]::RemoveDiacritics("ABC-abc-ČŠŽ-čšž") 
3
PS> [Text.Encoding]::ASCII.GetString([Text.Encoding]::GetEncoding(1251).GetBytes("Ramón")) 
Ramon 
PS> 
+0

Odrzucenie niektórych znaków, np. 'Æ × Þ ° ± ß ...'. [Przykład "prawdziwy angielski"] (https://www.researchgate.net/publication/277748378_Fore_daere_maerde_mod_astige_two_new_perspectives_on_the_Old_English_Gifts_of_men): zwraca 'Fore ?? re m? R? E?' Jeśli zastosowany do 'Fore ðære mærðe ...' – JosefZ

Powiązane problemy