22 Stimmen

PowerShell: Wie begrenzt man eine Zeichenfolge auf N Zeichen?

Substring beschwert sich, wenn ich versuche, eine Zeichenfolge auf 10 Zeichen zu begrenzen, die nicht 10 oder mehr Zeichen lang ist. Ich weiß, dass ich die Länge testen kann, aber ich würde gerne wissen, ob es ein einziges Cmdlet gibt, das das tut, was ich brauche.

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)

39voto

Dmitry Tashkinov Punkte 1896

Benötigen Sie genau ein Cmdlet? Ich frage mich, warum Sie die Länge nicht erhalten möchten. Wenn es Teil eines Skripts ist, dann sieht es gut aus.

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

33voto

Ro Yo Mi Punkte 14173

Die Verwendung der Funktion substring hat ihre Grenzen und erfordert, dass Sie zunächst die Länge der Zeichenkette erfassen. Zugegeben, das funktioniert auch ohne diese Einschränkung.

Das folgende Beispiel gibt die ersten 5 Zeichen der Zeichenkette zurück

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

Und das funktioniert auch bei Saiten, die kürzer als die gewünschte Länge sind

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

3voto

G Schmitt Punkte 31

Sie können andere Bibliotheken laden und verwenden und deren String-Funktionen nutzen, zum Beispiel die visuelle Basic-String-Funktionen eignen sich gut für das, was Sie tun wollen

einmal pro Sitzung anrufen >[void][reflection.assembly]::LoadWithPartialName("microsoft.visualbasic")

dann verschiedene vb-Stringfunktionen verwenden

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

oder

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

2voto

TechnoTone Punkte 181

Die bisherigen Antworten passten nicht zu meinen Zwecken (nichts für ungut!), also habe ich Denomales obigen Vorschlag aufgegriffen und in eine Funktion umgewandelt, die ich gerne mit Ihnen teilen möchte:

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

Beispiel für die Verwendung:

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

0voto

Ethan Post Punkte 2970

Danke an Dmitry für die Antwort, ich habe es in eine Funktion umgewandelt und so gemacht, dass es 1-basiert ist, im Gegensatz zu 0-basiert.

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X