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

问题描述

我的控制台应用程序中有以下代码,用于使用 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 台服务器上运行良好,但在单个服务器上我得到了这个异常:

在 line:1 char:131 + ... !****** *(********6' *;*****'; + ~ 表达式或语句中的意外标记 'h' . 在 line:1 char:135 + ... * *(******' ; '; + ~~ 字符串缺少终止符:'。| ABC

这会在密码变量上引发错误。就我而言,我从外部 RESP API 获取密码。现在密码具有以下格式:

\"************

它以 2 个保留字符开头\",我得到的 JSON 对象将如下所示{"PASSWORD":"\"*******"}.. 那么问题可能是密码包含保留字符集\"吗?我该如何解决这个问题?

标签: c#stringpowershell

解决方案


现在密码具有以下格式:

\"*******

它以 2 个保留字符开头\"

如果您的密码确实来自 JSON,例如{"PASSWORD":"\"*******"}您的密码以 -开头\"- 它们以 开头",因为\它只是一个 JSON转义字符,需要"在 char 中嵌入文字。在(总是双引号的)JSON 字符串值中。

换句话说:如果您正确解析 JSON,则实际密码值将是:

"*******

您可以按如下方式验证这一点:

PS> ('{ "PASSWORD": "\"*******" }' | ConvertFrom-Json).PASSWORD
"*******

您的下一个问题是您将密码嵌入到表示PowerShell source code的字符串中,并且在该字符串中您使用(嵌入)单引号( '...')来包围值[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将接收具有以下文字内容的字符串:

add-pssnapin VMware.VimAutomation.Core; $vCenterServer = 'center1';$vCenterAdmin = 'jdoe' ;$vCenterPassword = '"***''***';

[1] 单引号正确的选择,因为使用双引号可能会导致 PowerShell 对嵌入值进行不必要的解释(字符串插值)。


推荐阅读