2010-02-25 26 views
10

Podłoża narzekają, gdy próbuję ograniczyć ciąg do 10 znaków, których długość nie przekracza 10 znaków. Wiem, że mogę przetestować długość, ale chciałbym wiedzieć, czy istnieje jeden cmdlet, który zrobi to, czego potrzebuję.PowerShell: Jak ograniczyć ciąg do N znaków?

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) 

Odpowiedz

20

Potrzebujesz dokładnie cmdlet? Zastanawiam się, dlaczego nie lubisz tracić czasu. Jeśli jest częścią skryptu, to wygląda dobrze.

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

Dzięki temu zadziała. Szukałem funkcji "najmniejszych" i "największych" i nie byłem świadomy tej metody. –

+1

Jest to biblioteka standardowa .Net. Jeśli nie znajdziesz polecenia cmdlet, które robi to, co chcesz, sprawdź metodę, która to robi w .Net. –

+0

Jest to poprawne tylko dla startIndex = 0. W przeciwnym razie odinstaluj to z drugiego argumentu dla Min. tj. '@ s.substring (3, [System.Math] :: Min (10, $ s.Length - 3))' – svandragt

0

Dzięki Dmitrija na odpowiedź, zwróciłem go do funkcji i uczynił ją, więc jest 1 oparte w przeciwieństwie do 0 na podstawie.

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

można ładować i korzystać z innych bibliotek i korzystania z ich funkcji ciągu, na przykład wizualne podstawowe funkcje łańcuchowe działa ładnie na to, co chcesz zrobić


połączenia raz na sesję >[void][reflection.assembly]::LoadWithPartialName("microsoft.visualbasic")

następnie użyj różnych funkcji ciągów znaków vb

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

lub

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

Używanie funkcji podciągu ma swoje ograniczenia i wymaga najpierw uchwycenia długości napisu. To prawda, że ​​możesz to zrobić bez tego ograniczenia.

Poniższa powróci 5 pierwszych znaków łańcucha

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

A to będzie działać na łańcuchach, które są krótsze niż pożądanej długości

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

Dotychczasowe odpowiedzi nie spełnić swoje cele (bez urazy!), więc wziąłem sugestię Denomalesa powyżej i przetasowałem ją w funkcję, którą myślałem, że będę się dzielić:

function Trim-Length { 
param (
    [parameter(Mandatory=$True,ValueFromPipeline=$True)] [string] $Str 
    , [parameter(Mandatory=$True,Position=1)] [int] $Length 
) 
    $Str[0..($Length-1)] -join "" 
} 

Przykładowe zastosowania:

"1234567" | Trim-Length 4 # returns: "1234" 
"1234" | Trim-Length 99  # returns: "1234" 
Powiązane problemy