2017-02-14 17 views
0

ユーザーディレクトリをループし、XMLドキュメントを変更してアプリケーションの設定を変更するスクリプトを作成しました。通常、foreachを使用すると、コレクションから変数= 1アイテムになります。代わりに、このスクリプトは$XMLPathsのすべてを私の$Path変数に入れています。Powershellを使用したForeachを使用した複数のXMLドキュメントの変更

$XMLPaths = Get-ChildItem \\DFSRoot\DFSShare\view\Profiles\*\AppData\Roaming\Trillian\ -Recurse -Force | 
      Where-Object {$_.Name -contains 'Events.xml'} | 
      Select FullName | 
      FT -HideTableHeaders | 
      Out-String 

foreach ($Path in $XMLPaths) { 
    $xml = [xml](Get-Content $Path) 
    $node = $xml.events.prefs.setting | Where {$_.Name -eq 'Sounds'} 
    $node.value = '1' 
    $XML.Save($Path) 
    $Path 
    $node 
} 

ここに私が使用しているXML文書があります。唯一の代わりに、これを持っている時点で、その中に一つのディレクトリを持っている必要があり

<?xml version="1.0" encoding="utf-8" ?> 
    <!DOCTYPE events 
     PUBLIC "--//IETF//DTD RFCxxxx XEVENTS 1.0//EN" "xevents.dtd"> 

<!-- WARNING: This is a generated file by Trillian. Do not update while --> 
<!--   Trillian is running otherwise updates will be erased  --> 

    <events> 
     <version>1.0</version> 
     <Prefs> 
      <setting name="idle" value="1"/> 
      <setting name="sounds" value="1"/> 
      <setting name="sounds_away" value="1"/> 
      <setting name="sounds_suppress" value="1"/> 
      <setting name="automatic_outbound" value="1"/> 
      <setting name="hide_disabled" value="1"/> 
      <setting name="video_capture" value="1"/> 
      <setting name="buzz_sound" value="1"/> 
      <setting name="game_status" value="0"/> 
      <setting name="awaymessage_song" value="0"/> 
      <setting name="awaymessage_autosave" value="1"/> 
      <setting name="awaymessage_update2" value="1"/> 
      <setting name="away_autoresponse" value="0"/> 
     </Prefs> 
     <AwayList> 
      <AwayGroup name="Root"> 
       <AwayMessage label="Set%20all%20Do%20Not%20Disturb" text="" awayState="1" awayMenu="1" autoRespond="0" system="1"> 
        <Status medium="ASTRA" type="Do%20Not%20Disturb"/> 
       </AwayMessage> 
       <AwayMessage label="Set%20all%20Offline" text="" awayState="1" awayMenu="0" autoRespond="1" system="1"> 
        <Status medium="ASTRA" type="Offline"/> 
       </AwayMessage> 
       <AwayMessage label="Set%20all%20Away" text="Away%20since%20%25time%25%20%28%25timeZoneOffset%25%29" awayState="1" awayMenu="1" autoRespond="1" system="1"> 
        <Status medium="ASTRA" type="Away"/> 
       </AwayMessage> 
       <AwayMessage label="Set%20all%20Invisible" text="" awayState="1" awayMenu="1" autoRespond="0" system="1"> 
        <Status medium="ASTRA" type="Invisible"/> 
       </AwayMessage> 
       <AwayMessage label="Set%20all%20Back" text="" awayState="0" awayMenu="1" autoRespond="0" system="1"> 
        <Status medium="ASTRA" type="Online"/> 
       </AwayMessage> 
       <AwayMessage label="Set%20all%20Idle" text="Idle%20since%20%25time%25%20%28%25timeZoneOffset%25%29" awayState="1" awayMenu="0" autoRespond="1" system="1"> 
        <Status medium="ASTRA" type="Away"/> 
       </AwayMessage> 
      </AwayGroup> 
     </AwayList> 
    </events> 

変数$Path

\\DFSROOT\DFSSHare\view\Profiles\User1\AppData\Roaming\Trillian\users\User1\Events.xml 
\\DFSROOT\DFSSHare\view\Profiles\User2\AppData\Roaming\Trillian\users\User2\Events.xml 
\\DFSROOT\DFSSHare\view\Profiles\User3\AppData\Roaming\Trillian\users\User3\Events.xml 
\\DFSROOT\DFSSHare\view\Profiles\User4\AppData\Roaming\Trillian\users\User4\Events.xml 
\\DFSROOT\DFSSHare\view\Profiles\User5\AppData\Roaming\Trillian\users\User5\Events.xml
+0

パイプラインの中間ステップとして 'Format-Table'を使用しないでください。 – PetSerAl

+0

結果が文字列であることを実際に意図しない限り、 'Out-String'も使用しないでください。 –

答えて

0

問題は、あなたの結果$XMLPaths変数が文字列なく配列であることです。したがって、ForEach式は変数$XMLPathsを1つの要素の配列として解釈します。その要素の1つは、すべてのパスが連結された文字列です。

$Variableの変数のタイプは、いつでも$Variable.GetType()と入力して確認できます。私は、コードのあなたの最初の行を実行したときにたとえば、これは私が見たものである:Select FullName句、含まれているオブジェクトの配列の後

#Remote Computers 
$XMLPaths = (Get-ChildItem \\DFSRoot\DFS Share\view\Profiles\*\AppData\Roaming\Trillian\ -Recurse -Force | Where-Object {$_.Name -contains 'Events.xml'} | Select FullName).FullName 

PS > $XMLPaths.GetType() 

IsPublic IsSerial Name BaseType 
-------- -------- ---- -------- 
True  True  String System.Object 

はこれで最初の行を交換してみてくださいプロパティFullNameが返されます。したがって、.FullNameを呼び出すと、ファイル名の配列が返されます。

あなたは$XMLPathsは、型の配列であることを確認することができるはずです。

PS > $XMLPaths.GetType() 

IsPublic IsSerial Name  BaseType 
-------- -------- ----  -------- 
True  True  Object[] System.Array 
0

$XMLPaths.GetType().Name戻りString。 Use

$auxiliaryPath = "\\DFSRoot\DFS Share\view\Profiles\*\AppData\Roaming\Trillian" 
$XMLPaths = (Get-ChildItem "$auxiliaryPath\Events.xml" -Recurse -Force).FullName 
関連する問題