Ответ 1
Вам нужен именно командлет? Интересно, почему вам не нравится, когда нужно. Если это часть скрипта, то это выглядит хорошо.
$s = "12345"
$s.substring(0, [System.Math]::Min(10, $s.Length))
жалуется, когда я пытаюсь ограничить строку до 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)
Вам нужен именно командлет? Интересно, почему вам не нравится, когда нужно. Если это часть скрипта, то это выглядит хорошо.
$s = "12345"
$s.substring(0, [System.Math]::Min(10, $s.Length))
Использование подстрочной функции имеет ограничения и требует, чтобы вы сначала фиксировали длину строки. Конечно, это работает, вы можете сделать это без этого ограничения.
Далее будут возвращены первые 5 символов строки
"1234567890"[0..4] -join "" # returns the string '12345'
И это будет работать с строками, короче желаемой длины
"1234567890"[0..1000] -join "" # returns the string '1234567890'
Вы можете загружать и использовать другие библиотеки и использовать свои строковые функции, например визуальные основные функции строки прекрасно работают для того, что вы хотите сделать
- вызов один раз за сеанс
>[void][reflection.assembly]::LoadWithPartialName("microsoft.visualbasic")
затем используйте различные функции строки vb
>[microsoft.visualbasic.strings]::left("12345",10)
12345
или
>[microsoft.visualbasic.strings]::mid("12345",1,10)
12345
Предыдущие ответы не соответствовали моим целям (без обид!), поэтому я взял предложение 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"
Спасибо Дмитрию за ответ, я превратил его в функцию и сделал так, чтобы он был основан на 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