PowerShell 使用-Command 时参数内容包含引号问题
- 背景描述
在使用VMWare的PowerCLI开发虚拟机管理程序,使用"虚拟机自定义规范"来实现虚拟机的定制。
虚拟机自定义规范的GuiRunOnce调用只支持命令执行模式,因此需将在PowerShell写好的代码转换为命令执行模式。
下列代码片段是修改Oracle监听主机名,使得虚拟机新建出来时,主机名变化不会影响其中Oracle的使用。
- 在PowerShell控制台
可成功替换主机名。
(Get-Content "D:\app\Administrator\virtual\product\12.2.0\dbhome_1\network\admin\listener.ora").Replace("T-WIN2012","$RealHostname")|Set-Content "D:\app\Administrator\virtual\product\12.2.0\dbhome_1\network\admin\listener.ora"
- 作为命令执行时
是1的命令版,可直接在运行中执行。作为命令执行时,若参数内容包含引号,需要使用"将引号转义,避免被解析为命令参数。
此部分需要特殊注意。
2.1. 样例A
powershell -Command "(Get-Content \"D:\app\Administrator\virtual\product\12.2.0\dbhome_1\network\admin\listener.ora\").Replace(\"T-WIN2012\",\"$RealHostname\")|Set-Content \"D:\app\Administrator\virtual\product\12.2.0\dbhome_1\network\admin\listener.ora\""
2.2. 样例B
省略了 -Command参数,其他相同。
powershell "(Get-Content \"D:\app\Administrator\virtual\product\12.2.0\dbhome_1\network\admin\listener.ora\").Replace(\"T-WIN2012\",\"$RealHostname\")|Set-Content \"D:\app\Administrator\virtual\product\12.2.0\dbhome_1\network\admin\listener.ora\""