2010-02-25 69 views
10

当我尝试将字符串限制为10个字符而不是10个或更多字符长度时,子串抱怨。我知道我可以测试这个长度,但我想知道是否有一个cmdlet可以完成我所需要的功能。PowerShell:如何将字符串限制为N个字符?

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) 

回答

20

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

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

谢谢,这将正常工作。我在寻找“最少”和“最大”的功能,并没有意识到这种方法。 – 2010-02-25 18:27:54

+1

它来自.Net标准库。如果没有找到所需的cmdlet,请检查在.Net中执行此操作的方法。 – 2010-02-25 18:33:37

+0

这只对startIndex = 0是正确的。否则,从第二个参数中减去Min。即'@ s.substring(3,[System.Math] :: Min(10,$ s.Length - 3))' – svandragt 2015-09-01 13:24:29

0

由于梅德的回答,我把它变成一个函数,所以它是基于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 
3

您可以加载并希望每节做


调用一次什么用到其他库,并利用自己的字符串函数,例如视觉 基本字符串函数很好的工作了 >[void][reflection.assembly]::LoadWithPartialName("microsoft.visualbasic")

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

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

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

使用子字符串函数有它的局限性,并且需要您首先捕获字符串的长度。当然,这个工作你可以做到,没有这个限制。

下将返回字符串

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

的前5个字符,这将上比期望的长度

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

以前的答案不适合我的目的,更短的字符串工作(没有冒犯!)所以我拿上面的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"