在PowerShell中查找字符串中的变量

时间:2016-04-12 12:34:10

标签: powershell

我有这样的示例代码:

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

现在我想知道的是,可以将$Text分别分成标准字符串和变量吗?因此,当我将此$Text变量传递给某个方法时,它能够单独提取$($variable.Option)吗?

我知道这是一个很长的镜头,但也许它在分配时没有立即处理?

最终目标是创建一个better version of method I wrote来制作多彩的powershell:

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
}

通常我可以通过执行类似

的操作来指定颜色
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

但这意味着我得到整个"线"的颜色。如果我想在一种颜色中获得普通文本颜色而在第二种颜色中获得变量,我将不得不这样做:

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

它还不错..但我只是想如果能够以更好的方式实现这一点,其中简单文本是一种颜色而变量是第二种。如果我想要更进一步,并且在绿色和虚假中使用$,那么还需要一些解析。

1 个答案:

答案 0 :(得分:1)

变量将在双引号内扩展。一旦完成,就没有历史可言。

这里有两种选择之一。您可以使用format运算符将字符串与变量的占位符一起发送。

使用格式化运算符

Using the format operator

上的ss64
# 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

字符串扩展

如果您真的想要我认为您要求的内容,那么您可以delay the string expansion使用原始字符串上的单引号。请注意,字符串中的单引号已被转义。

$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)