我是powershell的初学者,无法读取xml文件的路径值。
Settings.xml
<?xml version="1.0"?>
<Configuration>
<EmailSettings>
<SMTPServer>blabla</SMTPServer>
<SMTPPort>blabla</SMTPPort>
<Path>Repository\Excel</Path>
</EmailSettings>
</Configuration>
我要通过这种方式读取XML文件中的数据
$ScriptPath = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent
[xml]$ConfigFile = Get-Content "$ScriptPath\Settings.xml"
问题是,如果我显示提取的值,它会正确显示,而如果我将其与另一个值连接起来(例如,获取完整路径),则会得到此
Write-Host $ScriptPath
--> c:\script
write-host $ConfigFile.Configuration.EmailSettings.Path
--> Repository\Excel
write-host $ScriptPath\$ConfigFile.Configuration.EmailSettings.Path
--> c:\script\System.Xml.XmlDocument.Configuration.EmailSettings.Path
我们如何获取值(以字符串格式??)以能够与其他变量连接?
谢谢
答案 0 :(得分:1)
您需要$(...)
(子表达式运算符),以便在可扩展字符串内评估诸如<{1}}之类的表达式 < / em>。
相比之下,没有$ConfigFile.Configuration.EmailSettings.Path
的简单变量引用(例如$ScriptPath
)就可以了:
$(...)
请注意,我还添加了显式双引号,以使命令更健壮-有关详细信息,请参见下文。
顺便说一句:Write-Host
is generally the wrong tool to use,除非意图是明确地仅写入显示内容,而绕过PowerShell的输出流。
通常,不是单个表达式的 未加引号标记被隐式视为可扩展字符串,即,就像它们已传入一样双引号,大体the same rules apply。
但是,在没有显式引号的情况下,存在其他陷阱,例如以Write-Host "$ScriptPath\$($ConfigFile.Configuration.EmailSettings.Path)"
开头的令牌或需要转义其他字符,因此 始终双引号可扩展令牌是形成的好习惯。
PowerShell如何通常在参数模式下解析未加引号的令牌是一个复杂的话题-请参见this answer。