PowerShell:如何将字符串限制为N个字符?

zqdjd7g9  于 2023-06-29  发布在  Shell
关注(0)|答案(6)|浏览(135)

substring在我试图将字符串限制为10个字符而长度不是10个或更多字符时会发生错误。我知道我可以测试长度,但我想知道是否有一个单一的cmdlet将做我需要的。

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)
os8fio9y

os8fio9y1#

您是否确实需要cmdlet?我想知道你为什么不喜欢变长。如果这是剧本的一部分,那么它看起来很好。

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

c3frrgcw2#

使用substring函数有它的局限性,需要您首先捕获字符串的长度。假设这确实有效,你可以在没有这个限制的情况下做。
下面将返回字符串的前5个字符

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

这将适用于短于预期长度的字符串

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

qmb5sa223#

您可以加载和使用其他库,并使用它们的字符串函数,例如,visual basic字符串函数可以很好地完成您要做的事情
每会话调用一次>[void][reflection.assembly]::LoadWithPartialName("microsoft.visualbasic")
然后使用各种vb字符串函数

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

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

v64noz0r4#

前面的答案不符合我的目的(无意冒犯!)所以我采用了上面的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"
bz4sfanl

bz4sfanl5#

感谢Dmitry的回答,我把它变成了一个函数,使它基于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
hxzsmxv2

hxzsmxv26#

先垫垫垫怎么样。

$s = "12345"
$s.PadRight(10).Substring(0,10).TrimEnd() # returns "12345"

相关问题