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)
答案 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