我的控制台应用程序中包含以下代码,以使用PowerShell获取服务器信息:
string PsCmd = "add-pssnapin VMware.VimAutomation.Core; $vCenterServer = '" + vCenterName.Trim() + "';$vCenterAdmin = '" + vCenterUsername.Trim() + "' ;$vCenterPassword = '" + vCenterPassword + "';" + System.Environment.NewLine;
PsCmd = PsCmd + "$VIServer = Connect-VIServer -Server $vCenterServer -User $vCenterAdmin -Password $vCenterPassword;" + System.Environment.NewLine;
PsCmd = PsCmd + "Get-VMHost " + System.Environment.NewLine;
现在该脚本在我们拥有的150台服务器上运行良好,但是在单台服务器上却遇到此异常:
第1行char:131 + ...!****** *(******** 6' *; *****'; +〜 表达式或语句中出现意外的标记“ h”。在线:1个字符:135 + ... * *(******'; '; + ~~字符串缺少终止符:'。 | ABC
哪个在password变量上引发错误。就我而言,我是从外部RESP API获取密码的。现在,密码具有以下格式:
\"************
它从2个保留字符\"
开始,而我得到的JSON对象将如下{"PASSWORD":"\"*******"}
..那么问题可能在于密码包含保留字符集{{1 }} ??以及我该如何解决?
答案 0 :(得分:1)
您需要转义"
。您可以在PowerShell中使用`
字符,例如`"
尝试一下:
string PsCmd = "Add-PSSnapin VMware.VimAutomation.Core; $vCenterServer = '" + vCenterName.Trim() + "'; $vCenterAdmin = '" + vCenterUsername.Trim() + "'; $vCenterPassword = \"" + vCenterPassword.Replace("\"", "`\"") + "\";" + System.Environment.NewLine;
答案 1 :(得分:1)
现在密码具有以下格式:
\"*******
以2个保留字符
\"
开头的
如果您的密码确实来自JSON,例如{"PASSWORD":"\"*******"}
,则您的密码不是 以\"
开头-它们以"
开头,因为\
只是将文字"
嵌入char中所需的JSON 转义字符。 (始终用双引号括起来)JSON字符串值。
换句话说:如果您正确解析了JSON,则实际的密码值将为:
"*******
您可以按照以下说明进行验证:
PS> ('{ "PASSWORD": "\"*******" }' | ConvertFrom-Json).PASSWORD
"*******
您的下一个问题是您将密码嵌入代表 PowerShell源代码 的字符串中,并且正在使用该字符串(嵌入) 单引号('...'
)以包围值 [1] 。
为此,您必须将值嵌入的'
实例转义为''
,以免在PowerShell稍后解析代码时引起语法错误:
// Note the .Replace() calls
string PsCmd = "add-pssnapin VMware.VimAutomation.Core; $vCenterServer = '" +
vCenterName.Trim().Replace("'", "''") + "';$vCenterAdmin = '" +
vCenterUsername.Trim().Replace("'", "''") +
"' ;$vCenterPassword = '" + vCenterPassword.Replace("'", "''") + "';" +
System.Environment.NewLine;
C#变量"***'***
使用PSCmd
的文字口令值(以及中心和用户名的示例值),将收到具有以下文字内容的字符串:< / p>
add-pssnapin VMware.VimAutomation.Core; $vCenterServer = 'center1';$vCenterAdmin = 'jdoe' ;$vCenterPassword = '"***''***';
[1]并且单引号 是正确的选择,因为使用双引号可能会导致PowerShell对嵌入值进行不必要的解释(字符串插值)。 >