Поиск по сайту:

Как использовать Substring в PowerShell


Когда вы хотите извлечь часть строки в PowerShell, мы можем использовать метод Substring(). Этот метод позволяет нам указать начало и длину подстроки, которую мы хотим извлечь из строки.

В этой статье я объясню, как работает метод Substring, и покажу вам несколько примеров того, как получить части строки, используя функции startIndex и/или length.

Использование метода Substring в PowerShell

Метод Substring может использоваться для любого строкового объекта в PowerShell. Это может быть буквальная строка или любая переменная типа string.

Чтобы использовать метод, нам необходимо указать начальную точку строки, которую мы хотим извлечь. По желанию мы можем указать длину (количество символов), которую хотим извлечь.

Substring(startIndex, length)

Совет

Имейте в виду, что строка начинается с позиции 0, а не с 1.

Этот метод лучше всего объясняется с помощью примеров, поэтому начнем с следующей известной строки "hello world". Чтобы извлечь только слово world из строки, мы можем использовать следующую команду:

"Hello World".Substring(6)

Result
World

Мы только указали начальную точку подстроки, 6. Таким образом, метод извлечет все символы, начиная с позиции 6 строки.

Чтобы немного лучше объяснить положение каждого символа, я пронумеровал положение под каждой буквой строки. Как видите, на позиции 6 находится буква W.

Hello World
012345678910

Если мы хотим извлечь только слово Привет из строки, то нам необходимо указать начальный индекс 0 и длину 5 символов:

"Hello World".Substring(0,5)

Result
Hello

Работа с динамическими строками

При работе с динамическими строками вы не всегда знаете длину строки. Для этого мы можем использовать функцию длины строки внутри метода подстроки.

Предположим, у нас есть папка с файлами журналов, из которых мы хотим извлечь имена файлов без расширения. Само имя файла может иметь разную длину, но расширение в данном случае состоит из 3 букв и точки.

Итак, оставляем только имена файлов, мы можем получить длину имени файла и вычесть 4 символа из него:

$filename = "la-ams-file02-log-1.log"

$filename.Substring(0, $filename.Length - 4)

Result
la-ams-file02-log-1

Мы также можем использовать это в обратном порядке, чтобы получить только расширения из имен файлов. Мы определяем начальную позицию на основе длины имени файла и указываем длину в 3 символа:

$filename = "la-ams-file02-log-1.log"
$filename.Substring($filename.Length - 3, 3)

Result
log

В этом случае нам на самом деле не нужно указывать длину подстроки, которую нужно вернуть (3), потому что мы можем просто вернуть оставшиеся символы:

$filename.Substring($filename.Length - 3)

Result
log

Использование IndexOf в Substring

При работе с динамическими длинами строк иногда нужно извлечь часть строки посередине. В этом случае задача заключается в том, чтобы найти/вычислить точную стартовую позицию для метода подстроки.

Один из способов сделать это - использовать IndexOf. Этот метод позволяет найти позицию символа или строки внутри строки.

Вернёмся к нашему примеру с лог-файлами. Я добавил совершенно бесполезный формат даты с непоследовательной длиной. Чтобы получить только дату из названия лог-файлов, мы можем использовать метод IndexOf().

Мы собираемся искать в строке уникальную часть перед датой -log. Метод IndexOf вернет начальную позицию строки или символа, который вы искали, так что в этом случае нам нужно будет добавить к этому 4 символа:

$files = @(
    'la-ams-ad01-log-202223.log',
    'la-ams-ad01-log-2022113.log',
    'la-osl-ad01-log-2022113.log',
    'la-osl-file01-log-202214.log'
)
$files | Foreach {
    # Get the position of the substring 'log-' in each filename and add 4 to this position.
    $part = $_.Substring($_.IndexOf('log-') + 4)
    # Returns 202223.log for example
 
    # Remove the extension from the substring
    $date = $part.Substring(0, $part.Length - 4)
    write-host $date
    # Returns 202223 for example
}

В этом конкретном случае вы также можете использовать метод LastIndexOf() для нахождения последнего дефиса в именах файлов:

$files | Foreach {
    $part = $_.Substring($_.LastIndexOf('-') + 1)
    write-host $part

    $date = $part.Substring(0, $part.Length - 4)
    write-host $date
}

Заключение

При работе со строками в PowerShell вы, вероятно, будете часто использовать метод подстроки. Имейте в виду, что вы всегда можете комбинировать метод подстроки с другими операторами строк, такими как split или replace.

Надеюсь, вы нашли эту статью полезной. Если у вас есть вопросы, просто оставьте комментарий ниже.