2010-02-25 21 views
10

si lamenta quando provo a limitare una stringa a 10 caratteri che non sono 10 o più caratteri di lunghezza. So di poter testare la lunghezza, ma vorrei sapere se c'è un singolo cmdlet che farà ciò di cui ho bisogno.PowerShell: come limitare la stringa a N caratteri? La sottostringa

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) 

risposta

20

Avete bisogno esattamente di un cmdlet? Mi chiedo perché non ti piaccia allungare. Se fa parte di una sceneggiatura, allora sembra a posto.

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

Grazie, funzionerà correttamente. Stavo cercando "minimo" e "più grande" funzioni e non ero a conoscenza di questo metodo. –

+1

Proviene dalla libreria standard .Net. Quando non trovi un cmdlet che fa ciò che vuoi, controlla un metodo che faccia ciò in .Net. –

+0

Questo è corretto solo per startIndex = 0. Altrimenti, sottrarre quello dal secondo argomento per Min. cioè '@ s.substring (3, [System.Math] :: Min (10, $ s.Length - 3))' – svandragt

0

Grazie a Dmitry per la risposta, trasformato in una funzione e fatto in modo che si basa 1 anziché 0 basato.

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

È possibile caricare e utilizzare altre biblioteche e utilizzare le loro funzioni di stringa, per esempio le visuali funzioni di stringa di base funzionano bene per quello che si vuole fare


chiamata una volta per sessione >[void][reflection.assembly]::LoadWithPartialName("microsoft.visualbasic")

quindi utilizzare varie funzioni stringa vb

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

o

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

L'utilizzo della funzione di sottostringa presenta le sue limitazioni e richiede di acquisire prima la lunghezza della stringa. Detto questo funziona, puoi farlo senza quella limitazione.

Di seguito restituirà i primi 5 caratteri della stringa

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

E questo funziona su stringhe più brevi di lunghezza desiderata

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

Le risposte precedenti non soddisfare i miei scopi (senza offesa!) quindi ho preso il suggerimento di Denomales sopra e lo ho trasformato in una funzione che pensavo di condividere:

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

Esempi di utilizzo:

"1234567" | Trim-Length 4 # returns: "1234" 
"1234" | Trim-Length 99  # returns: "1234" 
Problemi correlati