PowerShell字符串插值支持格式说明符吗?

4

在 PowerShell 中,典型的字符串格式化(例如使用填充或指定数字)可以编写成如下形式:

>>> "x={0,5} and y={1:F3}" -f $x, $y
x=   10 and y=0.333

但是在PowerShell中,您也可以使用字符串插值,例如:

>>> $x=10
>>> $y=1/3
>>> "x=$x and y=$y"
x=10 and y=0.333333333333333

C#字符串插值也支持格式化说明符:

> var x = 10;
> var y = 1.0/3.0;
> $"x={x,5} and y = {y:F2}";
"x=   10 and y = 0.33"

有没有一种在Powershell中实现这个功能的方法?我尝试了很多组合,比如

>>> "var=$($var, 10)"
var=10 10

但它们都不起作用。这是否受支持?还是有一种简洁的方法调用C#来使用它?

更新:正如Mathias的答案和在Powershell的github上确认的那样,目前不支持此功能,因此我在这里提出了一个功能请求。


我猜你的意思是像我第二个代码示例中那样使用"var={0,10}" -f $var。好吧,因为我喜欢内联字符串插值,习惯了其他语言的语法,它有点更短,而且我觉得它更易读(通常情况下)。 - stijn
1
这里不清楚你的问题。你是指在变量 $var 左侧填充吗?如果是这样,你可以使用 String 方法 PadLeft,类似于 "var=$($var.ToString().PadLeft(5))" - Theo
@Theo 是的,填充、格式化数字和日期等通常的C#操作。请参见编辑以获得澄清。像您提出的那样做当然可以,但不是很简洁。 - stijn
@stijn - 从我所知道的来看... 不行。使用字符串组合的唯一方法是使用 -f 字符串格式操作符。显然,PowerShell 中没有其他方法可以做到这一点。 - Lee_Dailey
"$(' '*10)$var" - AdminOfThings
2个回答

6

这个支持吗?

不支持格式化字符串插值展开


如您所见,PowerShell 中的字符串插值展开是通过简单地解析嵌套在双引号字符串中的子表达式来实现的,并没有使用 {} 占位符。

如果您想进行字符串 格式化,可以使用 -f

值得一提的是,$s -f $a 直接被转换为一个 String.Format($s, $a) 调用。

对于支持字符串格式化的值类型,通常也可以使用格式化字符串调用 ToString()(就像在 C# 中一样):

PS C:\> $a = 1 / 3 
PS C:\> $a.ToString("F2")
0.33

0
用这种方法,可以使用-f运算符。 -f运算符将格式字符串作为第一个操作数,并将要格式化的项目作为第二个操作数。 格式字符串必须包含类似{n:f}的标记,其中n是要格式化的项目在项目中的索引,f是格式说明符。 例如,{0:D4}将获取第一个项目并将其格式化为最少4位的十进制数。 因此,'{0:D4}-{1:D3}' -f 24,3输出0024-003。 ref
在可展开的字符串内,可以在子表达式运算符$()中使用此功能。
一个真实的例子是将输入文件分割成每个文件包含十行,并使输出文件名包含一个填充了零以使其成为四位数的序列号。 可以像这样完成:
$i = 0; Get-Content input.txt -ReadCount 10 | %{ $i++; $_ | Out-File "output_$('{0:D4}' -f $i).txt" }

创建文件
output_0001.txt
output_0002.txt
...

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接