2016-04-12 18 views
0

ich einen Beispielcode wie diese habe:Variablen finden in Powershell in einem String

[string] $Text = "This is a string text with some $($variable.Option) and $otherOption and that's it". 

was Nun mochte ich wissen, wie es möglich getrennt, dass $Text in Standard-Strings und Variablen zu teilen? Wenn ich also diese $Text Variable an eine Methode übergebe, kann sie $($variable.Option) separat extrahieren?

Ich weiß, es ist ein langer Schuss, aber vielleicht wird es nicht sofort zur Zeit der Zuweisung verarbeitet?

Das ultimative Ziel ist es, eine better version of method I wrote zur Herstellung von bunten Powershell zu erstellen:

function Write-Color([String[]]$Text, [ConsoleColor[]]$Color = "White", [int]$StartTab = 0, [int] $LinesBefore = 0,[int] $LinesAfter = 0) { 
    $DefaultColor = $Color[0] 
    if ($LinesBefore -ne 0) { for ($i = 0; $i -lt $LinesBefore; $i++) { Write-Host "`n" -NoNewline } } # Add empty line before 
    if ($StartTab -ne 0) { for ($i = 0; $i -lt $StartTab; $i++) { Write-Host "`t" -NoNewLine } } # Add TABS before text 
    if ($Color.Count -ge $Text.Count) { 
     for ($i = 0; $i -lt $Text.Length; $i++) { Write-Host $Text[$i] -ForegroundColor $Color[$i] -NoNewLine } 
    } else { 
     for ($i = 0; $i -lt $Color.Length ; $i++) { Write-Host $Text[$i] -ForegroundColor $Color[$i] -NoNewLine } 
     for ($i = $Color.Length; $i -lt $Text.Length; $i++) { Write-Host $Text[$i] -ForegroundColor $DefaultColor -NoNewLine } 
    } 
    Write-Host 
    if ($LinesAfter -ne 0) { for ($i = 0; $i -lt $LinesAfter; $i++) { Write-Host "`n" } } # Add empty line after 
} 

Normalerweise kann ich Farben zuweisen, indem Sie so etwas wie

write-color -Text "[View][$($singleView.Title)]", 
        "[Row Limit: $($singleView.RowLimit)]", 
        "[Paged: $($singleView.Paged)]", 
        "[Default View: $($singleView.DefaultView)]", 
        "[Style ID: $($singleView.StyleID)]" -Color Yellow, Green, Red, Gray, Green 

tun Aber das bedeutet, dass ich Farben für die gesamte bekommen " Linie". Wenn ich möchte in den normalen Textfarben in einer Farbe und Variablen in der zweiten Farbe bekommen zu sein, würde ich so etwas wie dies zu tun:

write-color -Text "[View: ", "$($singleView.Title)", "]", 
        "[Row Limit: ", "$($singleView.RowLimit)", "]" ` 
      -Color Yellow, Green, Yellow, Yellow, Green, Yellow 

Es ist nicht schlecht .. aber ich dachte nur, wenn dies in einem durchgeführt werden kann besserer Weg, wo einfacher Text eine Farbe ist und Variablen der 2. sind. Wenn ich noch weiter gehen möchte und $ true in Green und False in Red haben würde, würde das auch etwas Parsing erfordern.

+1

Ich glaube nicht. Soweit ich weiß, wird die Zeichenkette sofort verarbeitet und analysiert, alle eingebetteten Variablen werden aufgelöst, und dann wird die resultierende Zeichenkette in '$ Text' gespeichert. '$ Text' hat kein Wissen über die Variablen, die verwendet werden, um es zu definieren. –

+1

Können Sie uns mehr sagen, was Sie implementieren möchten? Das hört sich sehr komisch an. –

+0

Falls dies ein XY-Problem ist, haben Sie ein konkretes Beispiel dafür, wie Sie diese Information verwenden würden, wenn es möglich wäre (was nicht an den Bacon-Bits liegt.). OH ....... du fragst nach verzögerter String-Erweiterung ..... – Matt

Antwort

1

Variablen werden in doppelte Anführungszeichen erweitert. Sobald das getan ist, gibt es keine Geschichte mehr, von der man sprechen kann.

Sie haben hier eine von zwei Möglichkeiten. Sie können den Formatoperator verwenden, um eine Zeichenfolge mit Platzhaltern für Ihre Variablen zu senden.

Verwenden Sie das Format Operator

SS64 auf Using the format operator

# Create a formatted string with variable placeholders 
$Text = "This is a string text with some {0} and {1} and that's it" 

# Pass that string into a function and put in the variables 
$stringParameterinFunction -f $variable.Option, $otherOption 

String Expansion

Wenn Sie wirklich, was wollte ich denke, sie dann fragen können Sie delay the string expansion durch Verwendung Single zitiert die ursprüngliche Zeichenfolge. Beachten Sie, dass das einfache Anführungszeichen in der Zeichenfolge maskiert wurde.

$Text = 'This is a string text with some $($variable.Option) and $otherOption and that''s it.' 

# Pass that string into a function and put in the variables 
$ExecutionContext.InvokeCommand.ExpandString($stringParameterinFunction) 
Verwandte Themen