我需要告诉我,我正在使用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语句不适合我想要的过程。有什么建议吗?
由于 约翰
答案 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中的值相同。