3

私は Powershell で静かな短い時間プログラミングを行っていることをお伝えする必要があります。

したがって、私がやろうとしているのは、データを XML ファイルに事前入力してそれらのデータを使用し、$var を powershell に入力してから、それらの var を使用して Active Directory 属性を変更することです。AD属性の変更については問題ありませんが、XMLファイルを呼び出して変数を埋める自動化プロセスはまったく機能していません。私は got メソッドを使用していないと思うので、助けを求めています。

これが私のXMLファイルです(ここでは2つのサイトのみが宣言されています)

<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>

変数名 $Destination を使用して、location.site.city を "-match" したいと考えています。$destination が市区町村に一致する場合、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
       } 
}

次に、これらの変数を使用して、他の Powershell コマンドで AD 属性を変更します

##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 ステートメントが続くと、実行したいプロセスに対して適切ではないと思うからです。何かアドバイス ?

ありがとうジョン

4

3 に答える 3

3

Select-Xmlこれは、サイトをフィルタリングするためのとを使用する別のオプションWhere-Objectと、コマンドレットパラメーター名に対応するキーを持つハッシュテーブルを使用するスプラッティング手法です。

これとメソッドの利点SelectNodes()は、XMLで大文字と小文字が区別されることです。また、「alma」を指定し、ファイル内の値の大文字と小文字が異なると、必要なものが得られない可能性があります。

飛び散りの詳細については、このページをご覧ください。

[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
于 2013-01-22T14:22:17.240 に答える
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
       } 
}
于 2013-01-22T13:28:06.310 に答える
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の値と同じである必要があることに注意してください。

于 2013-01-22T13:40:33.867 に答える