我在带有下面示例的脚本中使用格式运算符:
$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
不同。
与其他shell不同,PowerShell允许您通过将它们括在括号 [当调用PowerShell(...)
中来将命令和表达式作为命令参数] >>>。
因此,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.
[[
$(...)
的主要用途是:
- 扩展表达式或命令的输出
inside expandable strings
预先收集输出]之后,直接通过管道发送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语句$(...)
,subexpression operator
$(...)
对于在字符串内插中[很有用-例如Write-Host "1 + 1 = $(1 + 1)"
@(...)
,array subexpression operator multiple命令的输出作为参数和/或传递给< [确保
输出变为array;也就是说,即使输出恰好只包含one对象,输出也将以类型[object[]]
的(常规PowerShell)数组形式返回。从某种意义上说,这是单对象输出情况下$(...)
行为的inverse:它确保单对象输出也成为数组。