2015-08-25 77 views
1

我有以下代碼在PowerShell中解析XML文件,然後遍歷配置文件中的條目(即備份作業)和執行備份(通過調用函數)。在腳本塊中引用變量

if ($xmlfile.configuration.DBAndFilesBackup.item("MSSQL").haschildnodes) { 
    $xmlfile.configuration.DBAndFilesBackup.MSSQL.backup | 
     Start-RSJob -Name {$_.Name} -Throttle 2 -ScriptBlock { 
      # Begin the Backup 
      BeginBackup $_.Name $log 

      # Backup the mssql database 
      MSSQLBackup $_.Name $_.DBPath $Using:backupdir $Using:backuptempdir 

      # Backup the files 
      FilesBackup $_.Name $_.FolderName $_.FilesPath $Using:backupdir $Using:backuptempdir 

      # End the Backup 
      EndBackup $_.FolderName $_.Name $log $Using:emailTo $Using:backupdir $Using:backuptempdir 
     } -FunctionsToLoad BeginBackup,MSSQLBackup,FilesBackup,EndBackup,Mailer,PrintHeader | 
     Wait-RSJob | 
     Receive-RSJob | 
     Out-file "$ScriptDir\logs\corebackup\$ScriptName $($xmlfile.configuration.DBAndFilesBackup.MSSQL.backup.Name) $DateStamp.log" 
} 

Start-RSJob類似於Start-Job小命令,處理開球並行作業定製的PowerShell模塊。

RSJob和本機PowerShell Start-Job cmdlet似乎都無法處理PowerShell轉錄(日誌記錄)。因此,我利用Write-Output以及Out-File來捕獲作業的輸出。

我遇到的問題是,在腳本的Write-Output部分,我想在日誌文件名中包含備份的名稱。換句話說,我最終得到一個名爲「corebackup 2015-08-24.log」而不是「corebackup backupname 2015-08-24.log」的文件。

問題是如何將$_.Name傳遞給Out-File。現在寫了一個日誌,但沒有工作名稱。

回答

0

我無法得到任何上述與節流工作。換句話說,我可以得到輸出,但是然後節流打破了,或者我可以進行節流工作但不能輸出。

我最終使用的解決方案是每當我想輸出某些內容時,都會在腳本中添加一堆「Write-Output | Out-file $ log -Append」。

有點醜陋的黑客 - 但通過使用腳本內部我可以捕獲輸出。

感謝大家的幫助和建議。

2

然後將其包裝在另一個For-EachObject塊中,並將$_.Name分配給流水線外可訪問的變量。我看了看Start-RsJob文檔,它應該工作:

if ($xmlfile.Configuration.DBAndFilesBackup.Item('MSSQL').HasChildNodes) { 

    $xmlfile.Configuration.DBAndFilesBackup.MSSQL.Backup | ForEach-Object { 
     $BackupName = $_.Name 
     $_ | Start-RSJob -Name $BackupName -Throttle 2 -ScriptBlock { 

       # Begin the Backup 
       BeginBackup $_.Name $log 

       # Backup the mssql database 
       MSSQLBackup $_.Name $_.DBPath $Using:backupdir $Using:backuptempdir 

       # Backup the files 
       FilesBackup $_.Name $_.FolderName $_.FilesPath $Using:backupdir $Using:backuptempdir 

       # End the Backup 
       EndBackup $_.FolderName $_.Name $log $Using:emailTo $Using:backupdir $Using:backuptempdir 

      } -FunctionsToLoad BeginBackup,MSSQLBackup,FilesBackup,EndBackup,Mailer,PrintHeader | 
       Wait-RSJob | 
        Receive-RSJob | 
         Out-File "$ScriptDir\logs\corebackup\$ScriptName $BackupName $DateStamp.log" 
    } 
} 

附:我使用這個模塊進行日誌記錄,它捕獲來自PS主機的任何輸出:Enhanced Script Logging module

自動PowerShell控制檯輸出複製到一個日誌文件(從 輸出,錯誤,警告,詳細和調試流),而仍在 在控制檯上顯示輸出。日誌文件輸出前 與日期/時間和一個指示哪個流源於該行。

+1

不確定這是否可行,因爲'$ Name'在作業執行時不會在scritpblock內定義。我推薦使用'-ArgumentList',並使用'$ args'數組來設置它。 –

+0

@CarlosNunez是的,scriptblocks是棘手的,但我仍然不確定scriptblock中的其他變量來自哪裏('$ _。FolderName','$ _。FilesPath'等) – beatcracker

+0

腳本塊中的其他變量即將到來來自xml配置文件。所以xml看起來像這樣:<?xml version =「1.0」encoding =「utf-8」?> <結構> \t \t \t \t \t \t \t <備份名稱= 「我的首次備份」 DBPATH = 「\\ SERVER1 \一些\文件夾\」 FILESPATH =「\\ SERVER1 \一些其它路徑\」 /> \t \t \t \t \t <備份名稱= 「我的第二備份」 DBPATH = 「\\服務器2 \一些\文件夾\」 FILESPATH = 「\\服務器2 \一些其它路徑\」/> \t \t \t \t Brad

2

試試這個:

Start-RSJob -ArgumentList @($Name) -Throttle 2 -ScriptBlock { 
    $Name = $args[0] 
    ... 
} 
+0

@這將修復scriptblock,但它仍然不會不會將'$ _。Name'命名爲'Out-File' cmdlet。但是,如果我們將你的代碼與我的代碼結合起來,那麼應該可以工作:預先分配變量,將它傳遞給'ArgumentList'中的scriptblock,然後在'Out-File'中使用它。 – beatcracker

+0

我同意這一點! –