PowerShell: как ограничить строку до N символов? - PullRequest
13 голосов
/ 25 февраля 2010
Подстрока

жалуется, когда я пытаюсь ограничить строку 10 символами, длина которых не 10 или более символов. Я знаю, что могу проверить длину, но я хотел бы знать, есть ли один командлет, который будет делать то, что мне нужно.

PS C:\> "12345".substring(0,5)
12345

PS C:\> "12345".substring(0,10)
Exception calling "Substring" with "2" argument(s): "Index and length must refer to a location within the string.
Parameter name: length"
At line:1 char:18
+ "12345".substring( <<<< 0,10)

Ответы [ 5 ]

22 голосов
/ 25 февраля 2010

Вам нужен именно командлет? Интересно, почему тебе не нравится получать длину? Если это часть скрипта, то выглядит нормально.

$s = "12345"
$s.substring(0, [System.Math]::Min(10, $s.Length))
11 голосов
/ 16 июня 2015

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

Следующая команда вернет первые 5 символов строки

"1234567890"[0..4] -join ""     # returns the string '12345'

И это будет работать для строк, которые короче желаемой длины

"1234567890"[0..1000] -join ""  # returns the string '1234567890'
3 голосов
/ 08 марта 2011

Вы можете загружать и использовать другие библиотеки и использовать их строковые функции, например визуальные базовые строковые функции прекрасно работают для того, что вы хотите сделать


вызов один раз за сеанс >[void][reflection.assembly]::LoadWithPartialName("microsoft.visualbasic")

затем используйте различные строковые функции vb

>[microsoft.visualbasic.strings]::left("12345",10)
12345

или

>[microsoft.visualbasic.strings]::mid("12345",1,10)
12345
2 голосов
/ 08 сентября 2015

Предыдущие ответы не подходили для моих целей (не обижайся!), Поэтому я принял предложение Деномалеса выше и свернул его в функцию, которой, как я думал, я поделюсь:

function Trim-Length {
param (
    [parameter(Mandatory=$True,ValueFromPipeline=$True)] [string] $Str
  , [parameter(Mandatory=$True,Position=1)] [int] $Length
)
    $Str[0..($Length-1)] -join ""
}

Пример использования:

"1234567" | Trim-Length 4    # returns: "1234"
"1234" | Trim-Length 99      # returns: "1234"
0 голосов
/ 25 февраля 2010

Спасибо Дмитрию за ответ, я превратил его в функцию и сделал так, чтобы она основывалась на 1, а не на 0.

function acme-substr ([string]$str, $start, $end) {
   $str.substring($start-1, [System.Math]::Min($str.Length-1, $end))
}

> $foo="0"*20
> $foo
00000000000000000000
> acme-substr $foo 1 5
00000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...