2013-05-13 100 views
0

我正在解析一個配置任務,並且需要獲取沒有「發送失敗的電子郵件」部分的所有任務。以下是xml任務的部分。讀取幾個相同類型的特定XML節點

<Settings> 
    <Tasks> 
     <Task ID="916360623" Name="name1" Active="0" NextEID="21" CacheNames="random"> 
      <Schedules/> 
      <NextActions> 
       <NextAction DoIfSuccess="1" DoIfFailure="0" DoIfNoAction="0" DoAfter="Task" Type="Task" TaskID="545310265"/> 
       <NextAction DoIfSuccess="0" DoIfFailure="1" DoIfNoAction="0" DoAfter="Task" Type="Email" HostID="385322183" AddressTo="[email protected], [email protected]" Subject="[TaskName] - [TaskStatus]" Message="emailMessageFail"/> 
       <NextAction DoIfSuccess="1" DoIfFailure="0" DoIfNoAction="0" DoAfter="Task" Type="Email" HostID="385322183" AddressTo="[email protected], [email protected]" Subject="[TaskName] - [TaskStatus]" Message="emailMessageSuccess"/> 
      </NextActions> 
     </Task> 
     <Task ID="701754236" Name="Task2" Active="0" NextEID="21" CacheNames="random"> 
      <NextActions> 
       <NextAction DoIfSuccess="1" DoIfFailure="0" DoIfNoAction="0" DoAfter="Task" Type="Task" TaskID="840519929"/> 
       <NextAction DoIfSuccess="0" DoIfFailure="1" DoIfNoAction="0" DoAfter="Task" Type="Email" HostID="385322183" AddressTo="[email protected], [email protected]" Subject="[TaskName] - [TaskStatus]" Message="emailMessage"/> 
      </NextActions> 
     </Task>    
    </Tasks> 
</Settings> 

我有一個PowerShell腳本,循環完成每項任務,每個<NextAction>但是,它似乎並沒有成功地只取我想要的任務。得到沒有DoIfFailue="1"Type="Email"的任務報告的最佳方式是什麼?

set-executionpolicy unrestricted 
[xml]$config = Get-Content c:\path\config.xml 
$allTasks = @() 
foreach($task in $config.Settings.Tasks.task){ 
    $taskID = $task.name 
    foreach($nextAction in $task.NextActions.NextAction){ 
     if(($nextAction.DoIfFailure = "1") -AND ($nextAction.type = "Email")){ 
      $address = $nextAction.addressto 
      $subject = $nextAction.subject 
      $message = $nextAction.message 
      $allTasks += @(New-Object -TypeName psobject -Property @{'ID' = $taskID; 'emailAddress' = $address; 'emailSubject' = $subject; 'emailMessage' = $message}) 
     } 
    } 
} 
$allTasks | Export-Csv -Path c:\path\output.csv -notype 

回答

1

的Equals測試在Powershell的是-eq,不=。所以這個:

if(($nextAction.DoIfFailure = "1") -AND ($nextAction.type = "Email")){ 

應該是這樣的:

if(($nextAction.DoIfFailure -eq "1") -AND ($nextAction.type -eq "Email")){ 

而且,你不需要set-executionpolicy unrestricted每一次,只是每臺服務器運行一次。

+0

啊織補它。自從我開始工作以來已經有一段時間了。就是這樣。謝謝! – mhopkins321 2013-05-13 15:42:02

+0

有相同的測試曾經'='在所有?我以爲他們總是'==':-) – 2013-05-13 16:16:07

+0

@Graimer:當然,嘗試VB(或VB.NET)。 – Neolisk 2013-05-13 16:34:32

0

你也可以試試這個:

$allTasks = @() 
$doc=New-Object -typename System.Xml.XmlDocument 
$doc.Load("c:\path\config.xml") 
$nextActions = $doc.SelectNodes("//NextAction[@DoIfFailure='1' and @Type='Email']") 

foreach($nextAction in $nextActions){ 
      $address = $nextAction.addressto 
      $subject = $nextAction.subject 
      $message = $nextAction.message 
      $allTasks += @(New-Object -TypeName psobject -Property @{'ID' = $taskID; 'emailAddress' = $address; 'emailSubject' = $subject; 'emailMessage' = $message}) 
    } 

$allTasks | Export-Csv -Path c:\path\output.csv -notype