PowerShell: как ограничить строку символами N?

Подстрока

жалуется, когда я пытаюсь ограничить строку до 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)

Ответ 1

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

$s = "12345"
$s.substring(0, [System.Math]::Min(10, $s.Length))

Ответ 2

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

Далее будут возвращены первые 5 символов строки

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

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

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

Ответ 3

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

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

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

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

или

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

Ответ 4

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

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"

Ответ 5

Спасибо Дмитрию за ответ, я превратил его в функцию и сделал так, чтобы он был основан на 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