使用格式运算符的Powershell颜色格式

问题描述 投票:1回答:1

我在带有下面示例的脚本中使用格式运算符:

$current = 1
$total   = 1250
$userCN  = "contoso.com/CONTOSO/Users/Adam Smith"

"{0, -35}: {1}" -f "SUCCESS: Updated user $current/$total", $userCN

这应该显示了以下输出:

SUCCESS: Updated user 1/1250 : contoso.com/CONTOSO/Users/Adam Smith

格式运算符可将目标输出文本保留在适当的位置,当前/总运行编号在1-99999之间变化。没有格式运算符,我可以这样突出显示成功行:

Write-Host -BackgroundColor Black -ForegroundColor Green "SUCCESS: Updated user $current/$total: $userCN"

但是问题是我如何结合使用突出显示颜色和格式运算符?仅存在-f参数,并且不允许使用颜色参数,因为首先它与Write-Host不同。

powershell syntax parameter-passing
1个回答
0
投票

与其他shell不同,PowerShell允许您通过将它们括在括号(...)中来将命令和表达式作为命令参数] >>>。

[当调用PowerShell

命令(cmdlet,脚本,函数)时,输出将作为参数作为其原始输出类型按原样传递。

因此,Theo来自注释的解决方案是正确的:

Write-Host -BackgroundColor Black -ForegroundColor Green `
           ("{0, -35}: {1}" -f "SUCCESS: Updated user $current/$total", $userCN) 

即执行-f内的(...)表达式,并将其输出(在这种情况下为单个字符串)作为位置参数传递给Write-Host(隐式绑定到-Object参数)。


注意您需要not

,在这种情况下需要$(...)subexpression operator

实际上,在某些情况下$(...)可能会无意中modify您的参数,因为它取消包装单元素数组

# Pass a single-element array to a script block (which acts like a function).
# (...) preserves the array as-is.
PS> & { param($array) $array.GetType().Name } -array ([array] 1)
Object[]  # OK - single-element array was passed as-is

# $(...) unwraps it.
PS> & { param($array) $array.GetType().Name } -array $([array] 1)
Int32  # !! Single-element array was unwrapped.

[[$(...)的主要用途是:

(字符串插值)
  • 预先收集输出]之后,直接通过管道发送compound statement的输出,例如foreach (...) { ... }if (...) { ... }。但是,您也可以将此类语句包装在. { ... }(在同一范围内执行)或. { ... }(在子范围内执行),以便获得通常的streaming

    行为(一对一)输出)在管道中。
    • 后退一步:假设您已经[[可以
    在变量分配中将复合语句用作
  • 表达式
  • ,例如$evenNums = foreach ($num in 1..3) { $num * 2 }-并且表达式通常被接受为流水线-例如'hi' | Write-Host -Fore Yellow-令人惊讶的是,目前它不适用于复合语句; this GitHub issue询问是否可以取消此限制。

    arguments传递给commands:

    要将multiple命令或(一个或多个)compound语句

    的输出作为参数和/或,如果输出恰好是single对象,则您希望该对象按原样使用,或者,如果它恰好是单元素数组(可枚举),则可以希望它是unwrapped(传递元素本身,而不是数组。当然,如果您要构造
      string
    自变量,则$(...)对于在字符串内插中[很有用-例如Write-Host "1 + 1 = $(1 + 1)"
  • 使用@(...)array subexpression operator
  • 仅当
  • 想要将

    multiple命令的输出作为参数和/或传递给< [确保

    输出变为array;也就是说,即使输出恰好只包含one对象,输出也将以类型[object[]]的(常规PowerShell)数组形式返回。从某种意义上说,这是单对象输出情况下$(...)行为的inverse:它确保单对象输出也成为数组。
    © www.soinside.com 2019 - 2024. All rights reserved.