2013-01-19 90 views
0

我試圖自動化日常批處理的日誌文件驗證。在PowerShell中處理大量嵌套數據的最佳方法?

我想檢查20個可能有30個批次的服務器,每個批次可以生成一個或多個日誌文件,我想用幾個標準來驗證它們。
因此,這將以相當大量的數據結束。

我的第一個,雖然是使用嵌套的數組和哈希表然後創建psobject這樣的:

[email protected](
    @{ 
    "name"="server1"; 
    "credential"="domain\user"; 
    "batch"[email protected](
       @{"batchName"="test";"path"="e:\cit\sauvegarde\batch\recup.cmd";"comment"="batch de test";"schedule"="lundi,mardi "; 
        "validations"[email protected](
         @{"name"="log exist";"path"="\\smacweb\e$\cit\test.log";"filter"[email protected]("NotNull";"NotOlderThan,2") }; 
         @{"name"="no erros";"path"="\\smacweb\CIT\sauvegarde\logs\*.log";"filter"[email protected]("NotContains,'error'") }; 
       )}; 
       @{"batchName"="mysql";"comment"="dump des bases mysql";"schedule"="lundi,mardi,vendredi"; 
        "validations"[email protected](
         @{"name"="log exist";"path"="\\smacweb\e$\mysqldump\dump.zip";"filter"[email protected]("NotNull";"NotOlderThan,2") }; 
         @{"name"="zipOK";"path"="\\smacweb\e$\mysqldump\dump.zip";"filter"[email protected]("Test-Zip") }; 
       )}; 
     ) 
    }; 
#  @{ 
#  "name"="server2"; 
#  "credential"="domain\user2"; 
#  "batch"[email protected](
#    @{"batchName"=.....}; 
# )}; 
) 

[email protected]() 
$servers | % { 
     $srv+= New-Object -TypeName psobject -Property $_; 
} 

這是一個小例子,但我想它會很快變得難以讀取。 那麼更好的方法是什麼呢?使用XML(不熟悉我),使用外部數據庫,其他方法?

+0

XML是propably的最明智的選擇。至少要從PS腳本中分離驗證規則。儘管如此,我對xml不夠熟悉。 –

回答

1

注意:我是一個noob當涉及到XML,但我試了一下。這只是您如何瀏覽XML文件的一個例子。 :)

XML文件(的test.xml):通過服務器和批次

<?xml version="1.0" encoding="utf-8"?> 
<servers> 
    <server> 
    <servername>server1</servername> 
    <credential>domain\user</credential> 
    <batches> 
     <batch> 
     <batchname>test</batchname> 
     <batchpath>e:\cit\sauvegarde\batch\recup.cmd</batchpath> 
     <comment>batch de test</comment> 
     <schedule> 
      <day>lundi</day> 
      <day>mardi</day> 
     </schedule> 
     <validations> 
      <validation> 
      <name>log exist</name> 
      <path>\\smacweb\e$\cit\test.log</path> 
      <filters> 
       <filter>NotNull</filter> 
       <filter>NotOlderThan,2</filter> 
      </filters> 
      </validation> 
      <validation> 
      <name>no erros</name> 
      <path>\\smacweb\CIT\sauvegarde\logs\*.log</path> 
      <filters> 
       <filter>NotContains,'error'</filter> 
      </filters> 
      </validation> 
     </validations> 
     </batch> 
     <batch> 
     <batchname>mysql</batchname> 
     <comment>dump des bases mysql</comment> 
     <schedule> 
      <day>lundi</day> 
      <day>mardi</day> 
      <day>vendredi</day> 
     </schedule> 
     <validations> 
      <validation> 
      <name>log exist</name> 
      <path>\\smacweb\e$\mysqldump\dump.zip</path> 
      <filters> 
       <filter>NotNull</filter> 
       <filter>NotOlderThan,2</filter> 
      </filters> 
      </validation> 
      <validation> 
      <name>zipOK</name> 
      <path>\\smacweb\e$\mysqldump\dump.zip</path> 
      <filters> 
       <filter>Test-Zip</filter> 
      </filters> 
      </validation> 
     </validations> 
     </batch> 
    </batches> 
    </server> 
</servers> 

PowerShell的腳本循環:

function test { 
    $xml = [xml](Get-Content C:\Users\Frode\Desktop\test.xml) 

    $servers = $xml.SelectNodes("/servers/server") 

    foreach ($server in $servers) { 
     $batches = $server.SelectNodes("batches/batch") 

     Write-Host "Server: $($server.servername)" 
     foreach ($batch in $batches) { 
      Write-Host "Checking batch: $($batch.batchname)" 
     } 
    } 
} 

輸出:

PS-ADMIN C:\Windows\system32> test 
Server: server1 
Checking batch: test 
Checking batch: mysql 
+0

感謝格雷默,+1爲你抽出一些時間,我等着看看是否有其他答案 –

+0

np。有可能會有更快的方法等,但最聰明的事情是至少將它分開,以便可以用不同的多個「規則集」調用腳本。防爆。您可以爲每個服務(mysql-cluster,web-cluster)創建一個xml,並使用'「mysql-test.xml」,「web-test.xml」來調用它們。 MyProcess'或什麼的:-) –

+0

我只是注意到比在v3有一個自動的foreach過程,所以你可以使用$ xml.servers.server循環到每個服務器 –

相關問題