-f 运算符是什么
PowerShell 的 -f 是格式化运算符,把左侧字符串里的 {0}、{1} 占位符按顺序替换成右侧的值,底层是 .NET 的 String.Format。它解决的问题是「把变量规规矩矩塞进固定模板」:日报表格要列对齐、日志前缀要统一时间格式、文件名要补零编号,用 -f 比一堆加号拼接更清晰,也更容易控制小数位与对齐宽度。
基本信息
| 适用平台 | Windows PowerShell 5.1 与 PowerShell 7 均支持 |
|---|---|
| 语法 | '模板 {索引[,对齐][:格式]}' -f 值1, 值2 |
| 索引 | 从 0 开始,可重复引用同一参数 |
| 对齐 | 整数为右对齐宽度,负数为左对齐宽度,如 {0,-12} |
| 格式说明符 | D 补零整数、N 千分位、F 定点小数、P 百分比、X 十六进制、日期用 yyyy-MM-dd |
| 相关替代 | 字符串插值如 "$($obj.Name)"、-join、格式化为表格的 Format-Table |
典型使用场景
- 对齐报表:把名称、地址、数值排成固定宽度,看的人一目了然
- 日志前缀:统一输出「时间 级别 消息」,便于后续检索与切分
- 数值展示:容量换算为 GB 并保留一位小数,避免长尾小数
- 文件名时间戳:生成 backup_2026-10-13_0200.zip 这类规范名称
- 拼装命令与 SQL 片段:模板清晰、易审阅(注意参数来源可信)
常用示例
常用示例
'{0} 端口 {1}' -f 'web', 80 # 最基本的替换
'{0,-20} {1,8}' -f 'node-01', '10.0.0.11' # 左对齐 20 宽 + 右对齐 8 宽
'{0,8:N0} MB' -f ((Get-Item D:\iso.iso).Length / 1MB) # 千分位、不保留小数
'{0:yyyy-MM-dd HH:mm}' -f (Get-Date) # 日期时间格式化
'disk {0:P1} used' -f 0.783 # 百分比并保留一位小数
'server-{0:D3}' -f 7 # 补零成三位编号
'{0}{1}' -f 'a', 'b' # 相邻占位符直接相接
'{{0}} {0}' -f 'x' # {{ }} 输出字面大括号常见格式说明符
| 写法 | 含义 | 示例输出 |
|---|---|---|
| {0:D3} | 十进制整数补零 | 007 |
| {0:N1} | 千分位分隔,保留一位小数 | 12,345.7 |
| {0:F2} | 定点小数两位 | 3.14 |
| {0:P1} | 百分比一位小数 | 78.3% |
| {0:X4} | 十六进制补零四位 | 00FF |
| {0,-12} | 左对齐占位 12 个字符 | node-01 |
| {0:yyyy-MM-dd} | 日期格式 | 2026-10-13 |
对齐宽度按字符数计算:汉字在等宽终端里占两个显示位,但 -f 只算一个字符,中文列混排时宽度要自行留出余量,否则表格会错位。
参数个数少于占位符会直接报错(索引越界),多传的参数则被忽略;模板改动后要同步核对参数列表,这类错误在批处理循环里往往到某个分支才暴露。
与其它写法的对照
与其它写法的对照
'{0} = {1}' -f 'a', 1 # 模板集中,适合多列报表
"$('a') = $(1)" # 字符串插值,短文本更自然
('a' + ' = ' + 1) # 加号拼接,类型混用易出错
'{0,10}' -f 'x' # 等价于 ('x').PadLeft(10)
Get-Process | Format-Table Name, @{n='MB'; e={[math]::Round($_.WS/1MB,1)}} # 表格输出用计算属性用 -f 拼装 SQL 或命令行时,外部可控的数据会直接进入语句或命令,形成注入风险;这类位置应改用参数化查询或 -ArgumentList 传参,别靠模板拼接。