在scriptblock中引用变量

时间:2015-08-25 00:46:22

标签: variables powershell scriptblock

我有以下代码,它在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是一个自定义PowerShell模块,类似于处理踢出并行作业的Start-Job cmdlet。

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。现在写了一个日志,但没有作业名称。

1 个答案:

答案 0 :(得分:0)

我无法通过节流获得上述任何一项工作。换句话说,我可以获得输出,但随后节流中断,或者我可以进行限制工作但不能获得输出。

我最终使用的解决方案是添加一堆" Write-Output | Out-file $ log -Append"每当我想输出一些东西时,我的脚本。

有点丑陋的黑客 - 但是通过使用脚本块内部我可以捕获输出。

感谢大家的帮助和建议。