首页/系统/Windows 运维速查/here-string 定义多行文本
PowerShell 基础66 条

here-string 定义多行文本

用 @ 引号语法定义多行字符串:单引号版是字面量、双引号版可插值,适合嵌入配置、SQL 与消息模板。

Windows 运维速查系统更新于 2026-10-13

语法是干什么的

here-string 是 PowerShell 定义多行文本的语法:@' 到 '@ 之间是字面量,@" 到 "@ 之间执行变量插值。它常用于嵌入 SQL、配置片段、脚本模板与消息正文,块内可自由使用单双引号而不必转义,可读性远胜字符串拼接。

什么时候不该用

here-string 只适合静态文本或少量插值:它不能循环展开、不支持条件拼接,块内也不方便调用格式化逻辑。需要按模板批量生成多份内容时,应改用字符串格式化、按行拼装数组再 Join,或借助模板引擎,否则容易写出难维护的超长文本块。

基本信息

适用平台PowerShell 2.0 及以后
语法@' 换行 内容 换行 '@;双引号版 @" ... "@ 支持插值
硬性规则起始 @ 后必须直接换行;结束标记必须行首顶格
配套用法配合 Set-Content / Add-Content 写文件,或直接作为命令参数传入

典型使用场景

  • 把多行 SQL 语句写进变量,再交给 Invoke-Sqlcmd 之类的命令执行
  • 生成配置文件、YAML 或 JSON 模板
  • 拼装含大量引号的命令行长文本,避免层层转义
  • 构造邮件正文或告警消息模板,用双引号版插入实时变量
  • 在脚本里内嵌说明文本或固定日志内容

常用示例

常用示例
$sql = @'
SELECT * FROM users
WHERE name = 'O''Brien'
'@
$msg = @"
主机: $env:COMPUTERNAME
时间: $(Get-Date -Format 'yyyy-MM-dd HH:mm')
"@
Set-Content D:\note.txt $msg -Encoding UTF8   # 写入文件时显式指定编码

两种写法对照

写法是否插值典型用途
@' ... '@否,纯字面量SQL、正则、含 $ 符号的文本
@" ... "@是,变量与表达式会展开消息模板、配置生成
结束标记位置必须行首顶格前有空格会报字符串缺少终止符
起始 @ 之后必须直接换行同行写内容会解析失败
结束标记必须顶格且单独占一行,前面多一个空格就会报“字符串缺少终止符”,这是 here-string 最高频的报错。
单引号版不做任何展开,SQL 里的 $ 列名或正则里的 $ 锚点用它更安全;需要插值时改用双引号版,并注意 $ 与 $( ) 会被求值。
here-string 会原样保留换行与缩进,写给其他工具消费时要注意行尾与缩进是否可接受,必要时先做替换再写盘。

易错点

  • 结束标记未顶格会报字符串缺少终止符,缩进排版时尤其容易踩
  • 双引号 here-string 内的 $ 与真实变量冲突时会被静默替换成空值
  • 起始 @ 后在同一行写内容会导致解析失败
  • 用 here-string 写文件时未指定编码,中文在 5.1 下会按 UTF-16 写出

数据来源与参考

  • Microsoft Learn:about_Quoting_Rules

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌