PowerShell脚本错误“表达式或语句中出现意外的标记'h'。该字符串缺少终止符:”

时间:2018-11-12 14:41:35

标签: c# string powershell

我的控制台应用程序中包含以下代码,以使用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 }} ??以及我该如何解决?

2 个答案:

答案 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对嵌入值进行不必要的解释(字符串插值)。