Mid, Substring, … главное хвост!

Те кто писал скрипты на VBScript наверняка помнят такую функцию как Mid, которая позволяла вырезать самые интересные кусочки из строки🙂

В PowerShell, (как и в .Net) в качестве замены Mid можно применять метод .SubString():

PS C:\PowerShell> "строка".SubString.OverloadDefinitions
System.String Substring(Int32 startIndex)
System.String Substring(Int32 startIndex, Int32 length)

Например:

PS C:\PowerShell> "строка".SubString(2)
рока
PS C:\PowerShell> "строка".SubString(2,3)
рок

Но самое интересное, что можно сделать и по-другому🙂

Строка в .Net легко преобразуется в массив символов, и благодаря этому можно например получить элемент строки под указанным индексом:

PS C:\PowerShell> "PowerShell"[0]
P

А если использовать отрицательные значения, то массив будет перебираться с конца:

PS C:\PowerShell> "PowerShell"[-1]
l

Но и это еще не всё! (с) Кроме выбора одного элемента, можно получить и диапазон! Попробуйте сами!🙂

PS C:\PowerShell> "PowerShell"[0..4]
P
o
w
e
r

PS C:\PowerShell> "PowerShell"[-5..-1]
S
h
e
l
l

Тут правда проявляется одна особенность — для индексирования строка преобразовывается в массив символов, и возвращается тоже массив символов, который хорошо бы склеить в одну строку. Если у вас установлены PowerShell Community Extensions (рекомендую🙂 ) то всё просто:

PS C:\PowerShell> "PowerShell"[-5..-1] | Join-String
Shell 

Но можно справиться и своими силами🙂 Для начала попробуем просто преобразовать результат в тип [string]:

PS C:\PowerShell> [string]"PowerShell"[-5..-1]
S h e l l

Какие то непонятные пробелы?🙂 Так и должно быть🙂 Дело в том что когда PowerShell преобразовывает массив в строку, он разделяет элементы массива тем что указано в специальной переменной, — $OFS (Output Field Separator). $OFS по умолчанию равна пробелу. Это очень удобно, например:

PS C:\PowerShell> $Arr = "Apple", "Orange", "Cherry"
PS C:\PowerShell> "I'm like to eat $Arr"
I'm like to eat Apple Orange Cherry

Наверное правильнее тут всё таки было бы поставить $OFS = «, »🙂 Но вернемся к нашей строчке:

PS C:\PowerShell> $OFS=""; [string]"PowerShell"[-5..-1]
Shell

Готово! Ну и конечно все вышеперечисленные действия точно также можно выполнять и на переменных:

PS C:\PowerShell> $str = "PowerShell"
PS C:\PowerShell> $OFS=""; $result = [string]$str[-5..-1]
PS C:\PowerShell> $result
Shell

Есть вопросы? Спрашивайте — с удовольствием отвечу🙂

Опубликовано в PowerShell. 4 комментария »

комментария 4 to “Mid, Substring, … главное хвост!”

  1. Loran Says:

    Алоха))
    А не мог посоветовать какую нибудь книгу или ресурс,кроме MS, по PS?

  2. xaegr Says:

    Алоха🙂
    Конечно мог бы, но всё-же рекомендую в первую очередь прочитать прилагающийся к PowerShell’у User Guide. Он есть на русском языке (в комплекте с мультиязычным PoSh).
    Во вторых рекомендую книжки PowerShell in Action и PowerShell Cookbook. Кроме того есть еще и бесплатная (хотя кого это волнует в нашей стране?🙂 ) книга https://xaegr.wordpress.com/?p=68

  3. KomatoZo Says:

    Как там было… «В мемориз!» =)
    Весьма познавательно. Еще бы ЗщЫр был в XP SP3 & Win2003 SP2 — цены бы ему не было =)

  4. xaegr Says:

    2 KomatoZo:
    Спасибо!🙂

    В сервиспаках Posh’а как я понимаю не будет (хотя про 2к3сп2 не знаю). Но он идет в виде необязательного обновления — тоже неплохо🙂


Обсуждение закрыто.

%d такие блоггеры, как: