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

时间:2010-02-25 18:07:39

标签: powershell

当我尝试将字符串限制为10个字符(长度不是10个或更多字符)时,

substring抱怨。我知道我可以测试长度,但我想知道是否有一个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)

5 个答案:

答案 0 :(得分:22)

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

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

答案 1 :(得分:11)

使用子字符串函数有其局限性,需要您首先捕获字符串的长度。当然,如果没有这个限制,你可以做到这一点。

以下内容将返回字符串

的前5个字符
"1234567890"[0..4] -join ""     # returns the string '12345'

这将适用于短于所需长度的字符串

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

答案 2 :(得分:3)

您可以加载和使用其他库并使用其字符串函数,例如visual 基本的字符串函数很适合你想做的事情

每次会话一次 >[void][reflection.assembly]::LoadWithPartialName("microsoft.visualbasic")

然后使用各种vb字符串函数

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

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

答案 3 :(得分:2)

以前的答案并不适合我的目的(没有冒犯!)所以我采取了上面的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"

答案 4 :(得分:0)

感谢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