Результатом выполнения команда в PowerShell являются объекты. Поэтому работ со строками сильно по уменьшилось. Но иногда приходится обрабатывать и текст.
Начнём с того, что получить строку в PowerShell довольно легко. Так например что бы получить и вывести строку: «Hello World!». Надо выполнить следующую команду:
1 |
"Hello World!" |
Строки Нумирация символов в строке начинается с нулевого символа. Максимальная длина строки в PowerShell зависит от характеристики компьютера. Так на XP она состовляет с 4 гигами оперативной памяти она составляет 151.001.191 символ, а на 8.1 с 8 Гб оперативной памяти до 1.073.741.791 символов.
Обратится к конкретному символу строки можно по следующему шаблону:
(строка) [номер символа]
Например результатом команды :
1 |
"Hello World!"[6] |
Будет символ W, это седьмой символ в строке, но нумерация начинается с нуля.
Так же можно воспользоваться методом Chars, указав в его параметре номер символа. Синтаксис данного метода:
[строка].Chars([номер символа])
Пример:
«Hello World!».Chars(6)
Результатом данной команды будет так же символ W.
Что бы присвоить переменной значение , надо воспользоваться оператором =
Пример:
1 2 3 |
$a ="Hello" $a |
В результате на консоль будет выведена строка «Hello»
Так же можно склеивать строки с помощью оператора +
Например:
1 2 3 |
$a =$a+" World!" $a |
или
1 2 3 |
$a += " World!" $a |
В результате на консоле будет выведена строка «Hello World!»
Так же со строками можно применять операторы сравнения, такие как
«-eq» — (=) проверяет равны ли строки между собой
«-ne» — (≠) обратный оператору -eq проверяет неравенство строк
«-gt» — (>) больше ли одна строка чем другая
«-lt» — (<) меньше ли одна строка чем другая
«-le» — (≤) меньше или равна одна строка чем другая
«-ge» — (≥) больше или равна одна строка чем другая
Самым часто используемым оператором среди них это «-eq». Пример:
1 |
"Hello World!" -eq "Hello World!" |
Результат будет True, так как строки идентичны.
Операторы же -gt, -lt, -le, -ge по сути могут помочь определить начинается ли данная строка подстрокой, пример:
Например так:
1 |
"Hello World!" -gt "Hello" |
Результатом будет True. Однако логичнее для этого использовать метод самой строки StartsWith о нём написано ниже.
Так же есть методы сравнения -like и -match
Оператор -like использует для сравнения шаблоны, как часто применялись в конадной строке дос, например:
1 |
"Hello World!" -Like "Hello*!" |
Результатом будет : True
Оператор -match использует регулярные выражения .NET. Что существенно увеличивает возможности данного метода.
Предыдущий пример мог бы выглядеть например так:
1 |
"Hello World!" -match "Hello[\D]*!" |
Результатом будет : True
При этом, в переменной $matches хранятся значения совпадений данного регулярного выражения. Это даёт большие возможности. Рассмотрим пример, как получить все строчки с ссылками из текста:
1 2 3 4 5 |
$a = get-help Get-Help -detailed $a -match "http://.*/" $matches[0].split(";") |
Результатом выполнения данного скрипта будет следующий набор строк: @(«http://schemas.microsoft.com/maml/2004/10», «xmlns:command=http://schemas.microsoft.com/maml/dev/command/2004/10″,»xmlns:dev=http://schemas.microsoft.com/maml/dev/2004/10″,»xmlns:MSHelp=http://msdn.microsoft.com/»)
Надо отметить утверждение о том, что все объекты в PowerShell являются объектами и строки тоже не являются исключениями.
Рассмотрим методы которые можно применить, для строк:
1 |
"Hello World!" | gm |
Clone — копия объекта.
Результатом метода будет точная копия данного объекта.
Его синтаксис: [String]=[Строка].Clone()
Например результатом данной команды:
1 |
("Hello World!").Clone() |
Будет строка «Hello World!».
CompareTo — сравнение двух строк
Вызывается он [int]= [1 строка].CompareTo([2 строка])
Результат данного метода 0 — тогда строки совпадают. Могут ещё быть -1 и 1.
-1 означает, что строка 1 меньше строки 2.
1 означет, что строка 1 больше строки 2
Например результатом данного выражения:
1 |
("Hello World!").CompareTo("Hello"); |
будет 1, а выражения
1 |
("Hello World!").CompareTo("hello world!"); |
будет -1.
Что бы сравнить две строки без учёта регистра, то надо воспользоваться методом .NET:
[string]::Compare([строка 1], [строка 2], [игнорировать ли регистр])
Сравним им строчки «Hello World!» и «hello world!»
1 |
[string]::Compare("Hello World!","hello world!",$True) |
Результатом будет 0, то есть две строки равны.
Contains — Нахождение подстроки
Данный метод поможет посмотреть, является ли данная строка подстрокой.
синтаксис метода такой:
[bool] = [строка 1].Contains([строка 2])
Результатом данного метода будет булевое значение, которое будет равно 0 если строка 2 будет являтся подстрокой строки 1.
Рассмотрим пример:
1 |
("Hello World!").Contains("World") |
результатом данного выражение будет значение «True». Однако данный метод чувствителен к регистру.
EndsWith — Заканчивается ли строка подстрокой
Синтаксис данного метода [bool] = [строка 1].EndsWith([строка 2])
Данный метод определит, заканчивается ли строка 1 — строкой 2.
например:
1 |
("Hello World!").EndsWith("World!") |
Результат True
StartsWith — начинается ли строка с подстроки
Синтаксис данного метода [bool] = [строка 1].StartsWith([строка 2])
Аналогично EndsWith данный метод определит начинается ли строка 1 со строки 2.
Пример:
1 |
("Hello World!").StartsWith("Hello") |
Результат True
Equals — сравнение двух строк
данный метод позволяет сравнить строки:
[bool] = [строка 1].Equals([строка 2])
Пример:
1 |
("Hello World!").Equals("Hello World!") |
Результатом данной операции будет True
Однако это удобнее записать так:
1 |
"Hello World!" -Eq "Hello World!" |
GetHashCode- получить Hash Code строки
Синтаксис этого метода:
[int] = [строка 1].GetHashCode()
Результатом выполнения Метода, на строке «Hello World!» :
1 |
("Hello World!").GetHashCode() |
Будет: «-1989043627»
IndexOf — индекс начала вхождения подстроки.
Данный метод позволяет получить индекс первого символа вхождения подстроки в строку:
Синтаксис:
[int] = [строка 1].IndexOf([строка 2])
Рассмотрим пример:
1 |
("Hello World!").IndexOf("World") |
Результатом выполнения данного скрипта, будет «6». Так как нумерация строки начинается с нулевого символа.
LastIndexOf — Последнее вхождение подстроки
В отличии от IndexOf показывает не первое значение входа подстраки а последнее , синтаксис этого метода:
[int]=[строка 1].LastIndexOf([строка 2])
Рассмотрим пример:
1 |
("Hello World!").LastIndexOf("o") |
Результатом будет значение 7.
IndexOfAny — первое вхождение любого символа из подстроки в строке.
Синтаксис:
[int] = [строка 1].IndexOfAny([строка 2])
Данный метод позволит получить первое вхождение любого символа из строки 2 в строке 1
Рассмотрим пример:
1 |
("Hello World!").IndexOfAny("World") |
Результатом будет 2, так как l присутствует и в слове World
LastIndexOfAny — последнне вхождение любого символа из подстроки в строке.
Синтаксис:
[int] = [строка 1].LastIndexOfAny([строка 2])
Анологично IndexOfAny ищет значение входа символов подстроки в строке, но выводит не первое вхождение, а последнее
Пример:
(«Hello World!»).LastIndexOfAny(«World»)
результатом данной команды будет 10, и это символ «d «.
Insert — Вставить в строку, подстроку.
Синтаксис:
[String]= [строка 1].Insert([Номер символа],[строка 2])
Результатом данного метода будет строка содержащая строку 2 начиная с символа «Номер символа»
Пример:
1 |
("Hello World!").Insert(11," of Warcraft") |
Результатом выполнения данного скрипта будет строка : «Hello World of Warcraft!»
PadLeft — дополнить строку символами с лева
Что бы дополнить строку до определённого кол-ва символов. Если мы хотим, что бы символы дополнялись с лева, можно воспользоваться командой PadLeft её синтаксис:
[String] = [строка 1].PadLeft([размер строки],[символ которым заполнять])
Пример:
1 |
"Hello World!".PadLeft(20,".") |
Результатом данной команды будет строка: «……..Hello World!»
PadRight — дополнить строку символами с права
Аналогично, как и PadLeft дополняет строку до указанного размера, символами, добавляя их с права. Синтаксис:
[String] = [строка 1].PadRight([размер строки],[символ которым заполнять])
Пример:
1 |
"Hello World!".PadRight(20,".") |
Результат данной команды будет строка : Hello World!……..
Remove — позволяет удалять из строки подстроки
Метод Remove перегружен и может использоваться в следующих синтаксисах:
[String] = [строка 1].Remove([кол-во символов])
результатом данной команды будет строка содержащая подстроку начиная с 0 символа строки 1 и заканчивая символом указанному в методе.
Пример:
1 |
("Hello World!").Remove(2) |
Результатом будет строка: «He»
Если же воспользоваться синтаксисом:
[String] = [строка 1].Remove([начальная позиция],[кол-во символов])
То результатом данной команды будет строка сформированная из строки 1, но в ней не будет содержаться указанное кол-во символов, начиная с начальная позиция.
Пример:
1 |
("Hello World!").Remove(4,2) |
Результат: «HellWorld!»
Substring — позволяет получить подстроку из строки
Метод Substring является кординально противоположный, чем метод Remove
Он так же перегружен и может использоватся в двух вариациях.
[String] = [строка 1].Substring([кол-во символов])
Результатом данной команды будет подстрока образованная из строки 1 путём удаления данное кол-во символов.
Пример:
1 |
"Hello World!".Substring(3) |
Результатом данной команды будет строка: «lo World!»
Так же существует другой синтаксис:
[String] = [строка 1].Substring([начальная позиция],[кол-во символов])
Тогда результатом данного метода будет подстрока сформированная из строки 1 содержащая указанное кол-во символов и начинающаяся с указанной позиции.
Пример:
1 |
"Hello World!".Substring(6,5) |
Результатом будет строка «World»
Replace — найти подстроку и заменить на свою
Данный метод позволяет заменить все вхождения подстроки в строке, на другую подсроку.
Синтаксис:
[String] = [строка 1].Replace([старая подстрока],[новая подстрока])
Пример:
1 |
("Hello World!").Replace("Hello","Goodbye") |
Результат «Goodbye World!»
Split — разбить строку на массив строк.
Иногда строку легче обрабатывать массивом, для этого есть метод Split. Он позволяет разбить строку на массив подстрок с помощью разделяющего символа или группу символов.
Синтаксис:
[string[] ]= [строка 1].Split([разделяющий символ])
Пример:
1 |
("Hello World !").Split(" ") |
результатом будет массив строк»Hello»,»World,!»
Если нам нужно указать не один разделитель а несколько, укажите перечисление:
Пример:
1 |
"Hello World!".Split(@("o","e")) |
Результатом будет массив строк :»H»,»ll»,» W»,»rld!»
Trim, TrimLeft, TrimRight — удаляем одинаковые символы по бокам страницы
Иногда нужно удалить повторяющиеся символы по бокам строки. Очень часто такими символами являются пробелы, для этого существует метор Trim он существует в следующих вариациях Trim, TrimLeft, TrimRight они отличаются областью действия, Trim отбрасывает не нужные символы с двух сторон строки, TrimLeft — только с лева, TrimRight — только с права.
что бы убрать лишние пробелы можно воспользоваться следующим синтаксисом:
[String]=[строка 1].Trim()
[String]=[строка 1].TrimLeft()
[String]=[строка 1].TrimRight()
Пример:
1 |
" Hello World! ".Trim() |
Результатом данной команды будет строка «Hello World!»
Если же мы хотим удалить не пробел, то этот символ надо ввести в параметр метода. Синтаксис:
[String]=[строка 1].Trim([удаляемый символ])
[String]=[строка 1].TrimLeft([удаляемый символ])
[String]=[строка 1].TrimRight([удаляемый символ])
Пример:
1 |
".........Hello World!........".Trim(".") |
Результатом данной команды будет строка «Hello World!»
Свойство Length — позволяет определить размер строки
Что бы посмотреть размер строки, надо воспользоваться свойством Length. Синтаксис:
[int] = [строка].Length
Пример:
1 |
"Hello World!".Length |
Результатом команды будет число 12
Преобразования строк в различные типы
У строки так же имеется ряд методов, которые конвертируют данные из строки в различные типы. Эти свойства ToBoolean, ToByte, ToChar, ToCharArray, ToDateTime, ToDecimal, ToDouble, ToInt16, ToInt32, ToInt64, ToLower, ToLowerInvariant, ToSByte, ToSingle, ToString, ToType, ToUInt16, ToUInt32, ToUInt64, ToUpper, ToUpperInvariant
GetEnumerator — получить перечисление
Полученить перечисление из строки.
Синтаксис этого метода:
[System.CharEnumerator] = [строка 1].GetEnumerator()
1 |
("Hello World!").GetEnumerator() |
Результатом данного метода будет перечисление @(‘H’,’e’,’l’,’l’,’o’,’ ‘,’W’,’o’,’r’,’l’,’d’,’!’)
GetType — получить тип объекта
Так как мы рассматриваем строки то возращаемый тип строки это String
Синтаксис:[System.RuntimeType] = [строка 1].GetType()
1 |
("Hello World!").GetType() |
Результатом будет объект System.RuntimeType со значением типа String
GetTypeCode — получить код типа объекта
Получить тип объекта, если мы работаем со строками то тип будет String.
Синтаксис: [System.TypeCode] = [строка 1].GetTypeCode()
1 |
("Hello World!").GetTypeCode() |
Результатом будет объект типа System.TypeCode со значением String
Говоря о строках, нельзя не упомянуть о командлете Select-String данный командлет является достойной альтернативой Grep в Unix он позволяет искать строки используя регулярные выражения .NET. Но рассматривать его лучше вместе с регулярными выражениями.
Split — разбить строку на массив строк
$fio=»Иваноф Ифан Иоанович Оглы»
$f=$fio.Split(» «,3)[0] # Иваноф
$i=$fio.Split(» «,3)[1] # Ифан
$o=$fio.Split(» «,3)[-1] # Иоанович Оглы
Подскажите, пожалуйста, а как, например, в документе из 20 строк, найти 15ую и вставить после n-го символа содержание переменной?
Давно я не отвечал на этом сайте…увлёкся 3д печатью, но не мог пропустить вопрос про powershell. ^)
и так содержимое файла:
Запихиваем его в переменную(массив)$t
Смотрим что там на 15 строчке:
Пойдёт 🙂
Вставляем бред вида » t» после 3 символа:
Ну как? запихнулось?
Да всё хорошо…
Записываем это всё в файл:
Ну и как там теперь файл?
Файлу хорошо 🙂
Спасибо большое, добрый человек!
В описании к Substring указан пример с Remove. Наверное «copy-paste» )
[String] = [строка 1].Remove([начальная позиция],[кол-во символов])
Спасибо, поправил.