ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

写出 PowerShell Here-String 多行字符串不再报解析错

写出 PowerShell Here-String 多行字符串不再报解析错 写出 PowerShell Here-String 多行字符串不再报解析错【免费下载链接】PowerShellPowerShell for every system!项目地址: https://gitcode.com/GitHub_Trending/po/PowerShell写多行模板字符串时我在同一行里既插了$name又顺手加了个#注释保存后脚本报无法解析错的位置还指不到注释上。这类问题在 PowerShell 的 Here-String把多行文本当一个字符串变量来写的语法里反复出现原因其实都集中在几个固定地方搞清楚后基本不会再犯。先记住两行定界符的规矩Here-String 的整块文本就是给变量赋的值单引号版/原样输出$不会触发插值双引号版/ 会解析变量。$plain name: $name $expanded name: $name 这两段分别演示单引号版原样输出和双引号版正常插值是两种模式的对照基准。解析规则只有两条硬性的起始符独占一行写在行首结束符或必须独占一行且顶格——前面一个空格都不行。所有报错几乎都是违反这两条或者插值表达式本身写了不合法的东西。最高频的三个报错原因结束符前带空格现象脚本报WhitespaceBeforeHereStringFooter提示指向结束符所在行。原因编辑器自动缩进把顶格的 也缩进了结束符就不再是行首。$block 模板第一行 模板第二行 $joined n 模板第三行修复是把结束符手动挪回顶格如果脚本会经过自动格式化可以用拼接把结尾段留在变量里构造避开被缩进破坏。之所以有效是解析器用行首 结束符原文这两个条件确认字符串终止缩进直接破坏这个匹配。想输出字面美元符号现象在可插值 Here-String 里写 SQL$users被当成变量引用解析直接报错。原因双引号版会把$后面紧跟的标识符都识别成变量。$raw SELECT * FROM $users 修复用反引号转义$前加即可$raw SELECT * FROM $users 反引号是 PowerShell 的转义符它后面的字符按字面量处理$users就不再被解释为变量。单引号版不需要这步——整个字符串不插值$天然原样输出能用单引号就别用双引号。续行反引号旁边写注释现象Hello # 续行注释 world这段单引号脚本本意是两行拼成一个字符串却报ExpectedValueExpression。原因注释紧跟在续行反引号后面时注释里的文本被当成了续行表达式的一部分解析器找不到合法的表达式。修复把注释单独成行放在反引号之后、续行内容之前Hello # 续行注释单独占一行 world这时反引号后面只跟了换行它正确地把下一行的 world拼成表达式而#那一行是独立注释互不干扰。保存前用解析器接口做语法自查与其等报错不如在保存前过一遍。仓库自带解析器接口不执行脚本就能抓出全部语法错误这是内置类型不是外部模块$tokens $null; $errors $null [System.Management.Automation.Language.Parser]::ParseInput( (Get-Content -Raw .\your-script.ps1), [ref]$tokens, [ref]$errors) $errors | ForEach-Object { $($_.Extent.StartLineNumber): $($_.Message) }第二条开一个干净会话验证运行效果避免旧会话里的变量干扰pwsh -NoProfile -File .\your-script.ps1我一般把第一条做成别名提交前对改过的每个脚本都跑一遍报错时行号会直接定位到问题所在比执行到一半才炸快得多。完整的对照行为可以在 行延续解析的测试用例 里核对续行加注释的每个边界都写成了断言。接下来可以做检查现有脚本里所有 Here-String 的结束符是否顶格不顶格的一律挪回双引号版里需要的字面$统一改成$能换成单引号版的地方直接换提交前用 解析器接口 对改动过的脚本各跑一遍语法检查【免费下载链接】PowerShellPowerShell for every system!项目地址: https://gitcode.com/GitHub_Trending/po/PowerShell创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表