c# - 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":"\"*******"}
.. 那么问题可能是密码包含保留字符集\"
吗?我该如何解决这个问题?
解决方案
现在密码具有以下格式:
\"*******
它以 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 对嵌入值进行不必要的解释(字符串插值)。
推荐阅读
- c - 如何编写 PX4 UAVCAN 或可以应用程序
- javascript - 反应useContext,当我删除一个元素时,另一个元素被删除了
- arrays - 如何在 koltin 的构造函数中初始化一对 byteArray?
- javascript - 根据前一个和下一个 id 对对象数组进行排序
- xamarin - System.Net.Http.HttpRequestException 本地网络地址上的“没有到主机的路由”?
- flutter - 在 Flutter 中下载 blob url
- c++ - 带两个参数的模板类转换
- c# - 我正在尝试获得所有员工职位(关系多对多)
- javascript - 更改 Google 协助语音
- c# - 通过 HttpContext 发送 EPPLus Excel 文件