2010-02-25 41 views
10

subcadena se queja cuando trato de limitar una cadena a 10 caracteres que no tienen 10 o más caracteres de longitud. Sé que puedo probar la longitud pero me gustaría saber si hay un solo cmdlet que haga lo que necesito.PowerShell: cómo limitar la cadena a N caracteres?

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) 

Respuesta

20

¿Necesita exactamente un cmdlet? Me pregunto por qué no te gusta obtener longitud. Si es parte de un script, se ve bien.

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

, gracias que no tendrán ningún problema. Estaba buscando las funciones "mínima" y "más grande" y no estaba al tanto de este método. –

+1

Es de la biblioteca estándar .Net. Cuando no encuentre un cmdlet que haga lo que desea, busque un método que haga esto en .Net. –

+0

Esto solo es correcto para startIndex = 0. De lo contrario, reste eso del segundo argumento para Min. es decir '@ s.substring (3, [System.Math] :: Min (10, $ s.Length - 3))' – svandragt

0

Gracias a Dmitry para la respuesta, la convirtieron en una función y lo convirtieron en lo que se basa en contraposición 1 a 0 sobre la base.

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

Puede cargar y utilizar otras bibliotecas y utilizar sus funciones de cadena, por ejemplo, las visuales funciones básicas de cuerda funcionan muy bien para lo que quieres hacer


llamada una vez por sesión >[void][reflection.assembly]::LoadWithPartialName("microsoft.visualbasic")

luego use varias funciones de cadena vb

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

o

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

El uso de la función de subcadena tiene sus limitaciones y requiere que primero capture la longitud de la cadena. Si esto funciona, puedes hacerlo sin esa limitación.

El siguiente devolverá los 5 primeros caracteres de la cadena

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

Y esto funcionará en cadenas más cortas que la longitud deseada

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

Las respuestas anteriores no se adaptaba a mis propósitos (¡sin ánimo de ofender!) así que tomé la sugerencia de Denomales anterior y la puse en una función que pensé que compartiría:

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

Ejemplo usos:

"1234567" | Trim-Length 4 # returns: "1234" 
"1234" | Trim-Length 99  # returns: "1234" 
Cuestiones relacionadas