语法是干什么的
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 会原样保留换行与缩进,写给其他工具消费时要注意行尾与缩进是否可接受,必要时先做替换再写盘。