2010-02-25 73 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"