Invoke-VMScript的-ScriptText参数如何处理引号问题?
PowerCLI中Invoke-VMScript的-ScriptText参数对引号与转义字符的处理
从你提供的Linux虚拟机测试案例来看,Invoke-VMScript的-ScriptText参数在将脚本传递到Linux guest系统时,会对反斜杠转义字符做如下特殊处理:
核心处理规则
连续反斜杠(无后续非反斜杠字符):
每两个连续的反斜杠会被合并为一个;如果是奇数个,最后一个单独保留。- 1个
\→ 保留为\ - 2个
\\→ 转换为\ - 3个
\\\→ 转换为\\ - 4个
\\\\→ 转换为\\
- 1个
反斜杠+非反斜杠字符:
所有前置的连续反斜杠会被缩减为单个反斜杠,后续字符保持不变。\a→ 保留为\a\\a→ 转换为\a\\\\a→ 转换为\a
结合测试示例验证
本地PowerShell定义的命令
$cmd = "set -x; printf '%s\\\n' '\' '\\' '\\\' '\\\\' '\a' '\\a' '\\\\a' "
执行$cmd后输出的本地脚本内容:
set -x; printf '%s\\\n' '\' '\\' '\\\' '\\\\' '\a' '\\a' '\\\\a'
传递到Linux guest后执行的实际命令(从set -x输出可见)
printf '%s\n' '\' '\' '\\' '\\' '\a' '\a' '\a'
对应参数的转换对比
| 本地脚本参数 | Guest中实际参数 | 转换规则 |
|---|---|---|
'\''(1个反斜杠) | '\'' | 单个反斜杠直接保留 |
'\\'(2个反斜杠) | '\'' | 两个反斜杠合并为一个 |
'\\\'(3个反斜杠) | '\\' | 前两个合并为一个,保留最后一个 |
'\\\\'(4个反斜杠) | '\\' | 两两合并为两个反斜杠 |
'\a'(\a) | '\a' | 单个反斜杠+字符直接保留 |
'\\a'(\a) | '\a' | 两个反斜杠缩减为单个+字符 |
'\\\\a'(\\a) | '\a' | 四个反斜杠缩减为单个+字符 |
注意事项
- 上述规则仅针对Linux guest的Bash环境,Windows guest的处理逻辑可能不同。
- 单引号在传递过程中会被直接保留,不会被解析或转义,因为Bash单引号内的内容均为字面量。
内容的提问来源于stack exchange,提问作者pynexj
相关产品推荐
相关产品推荐

