使用XML在Powershell中填充变量

时间:2013-01-22 13:22:37

标签: xml powershell

我需要告诉我,我正在使用Powershell进行编程以保持安静的短时间,并且有一些我目前处理不好的基本功能。

所以我要做的是将数据预先输入到XML文件中以使用这些数据并将$ var填充到powershell中,然后使用这些var来更改Active Directory属性。对于更改AD属性我很好,但通过调用XML文件来填充我的var的自动化过程根本就不起作用。我想我没有使用got方法,这就是我寻求帮助的原因。

这是我的XML文件(我只声明了两个Site)

<Location>
  <Site> 
    <City>Alma</City> 
    <Street>333 Pont Champlain Street</Street> 
    <POBox></POBox>
    <State>Ontario</State> 
    <Zip>G1Q 1Q9</Zip>
    <Country>CA</Country>
    <OfficePhone>+1 555-555-2211</OfficePhone>
   </Site> 

  <Site> 
    <City>Dolbeau</City> 
    <Street>2525 Avenue du Pinpont</Street> 
    <POBox></POBox>
    <State>Quebec</State> 
    <Zip>G2Q 2Q9</Zip>
    <Country>CA</Country>
    <OfficePhone>+1 555-555-3000</OfficePhone>        
  </Site>
</Location>

我想使用var名称$ Destination来“-match”location.site.city。如果$ destination匹配city,则填写var

$Newcity = location.site.city
$NewStreet = location.site.street
$NewState = location.site.state

等等

这是我做的脚本的一部分,但我无法得到我想要的结果。

$var1 = ""
$Street = ""
$Destination = "Alma"

[xml]$SiteAttribute = Get-Content SitesAttributes.xml

foreach( $City in $SiteAttribute.location.Site){
    $var1 = $site.city    
    If ($var1 -match $Destination){
       $NewStreet = $Site.Street
       $NewCity = $Site.city
       $NewPoBox = $site.POBox
       $NewState = $site.State
       $Newzip = $Site.zip
       $NewCountry = $Site.country
       $NewPhone = $Site.OfficePhone
       } 
}

然后我会使用那些var来改变我的AD属性与另一个Powershell命令

##Normal AD module come with W2k8
Import-Module ActiveDirectory

Set-ADUser $username -server $dc -StreetAddress $NewStreet -City $NewCity -State $NewState -PostalCode $NewZip -OfficePhone $NewPhone  -Country $NewCountry

但我所有的尝试都会失败,因为我认为我的Foreach语句后跟我的If语句不适合我想要的过程。有什么建议吗?

由于 约翰

3 个答案:

答案 0 :(得分:3)

这是使用Select-XML和Where-Object过滤站点的另一个选项,以及Splatting技术,使用带有与cmdlet参数名称对应的键的哈希表。

这与SelectNodes方法的优点是XML区分大小写,如果提供“alma”并且文件中值的大小不同,则可能无法获得所需的XML。

访问this page了解有关splatting的更多信息。

[xml]$xml = Get-Content SitesAttributes.xml
$site = $xml | Select-Xml -XPath "//Location/Site" | Where-Object {$_.Node.City -match 'alma'}

$params = @{
       StreetAddress = $site.Node.Street
       City = $site.Node.city
       State = $site.Node.State
       PostalCode = $site.Node.zip
       Country = $site.Node.country
       OfficePhone = $site.Node.OfficePhone
}

Import-Module ActiveDirectory
Set-ADUser $username -server $dc @params

答案 1 :(得分:2)

试试这个:

$var1 = ""
$Street = ""
$Destination = "Alma"
[xml]$SiteAttribute = Get-Content SitesAttributes.xml

foreach( $Site in $SiteAttribute.location.Site){ #this line in your code has issue
    $var1 = $Site.city    
    If ($var1 -match $Destination){
       $NewStreet = $Site.Street
       $NewCity = $Site.city
       $NewPoBox = $site.POBox
       $NewState = $site.State
       $Newzip = $Site.zip
       $NewCountry = $Site.country
       $NewPhone = $Site.OfficePhone
       } 
}

答案 2 :(得分:1)

您的foreach循环中似乎只有一个拼写错误(您使用的是$City in...而不是$Site in ...)。清理答案的另一种方法是首先只获得匹配的网站。

例如:

$xml = [xml](Get-Content .\my.xml)
$destination = "Alma"

$sites = $xml.SelectNodes("/Location/Site[City='$destination']")

$sites | % { 
    $NewStreet = $_.Street
    $NewCity = $_.city
    $NewPoBox = $_.POBox
    $NewState = $_.State
    $Newzip = $_.zip
    $NewCountry = $_.country
    $NewPhone = $_.OfficePhone
    }

#Printing variables to test
$NewStreet
$NewCity
$NewPoBox
$NewState
$Newzip
$NewCountry
$NewPhone

请注意,xpath区分大小写,因此$ destination必须与XML中的值相同。