Помощь с событиями Powershell - PullRequest
1 голос
/ 15 июня 2011

У меня есть функция для восстановления базы данных сервера sql с помощью «Microsoft.SqlServer.Management.Smo.Restore. Существует событие, называемое завершенным, и в коде, который я поместил

 Register-ObjectEvent -InputObject $restore  -EventName "Complete" -SourceIdentifier CompleteRestore -Action { Write-Host "Works"} | Out-Null

, оно отлично работаетПо завершении восстановления появляется сообщение.

Когда я запускаю функцию с помощью Powershell Job, восстановление выполняется, но сообщение не появляется.

Можете ли вы помочь мне, ребята?

Спасибо

Я использую этот код для запуска функции в качестве задания, а объект Register находится внутри функции Invoke-SqlRestoreEventing

$server = "."
$dbname = "TestPoshEventing_6"
$filepath = "c:\temp\backup\TestPoshEventing.bak"
$Realocatefiles = @{TestPoshEventing='c:\temp\restore\TestPoshEventing_6.mdf';TestPoshEventing_log='c:\temp\restore\TestPoshEventing_6.ldf'}
Start-Job -Name "Restore1" -InitializationScript  {Import-Module c:\temp\testes\PoshTest.psm1 -Force} -scriptblock { Invoke-SqlRestoreEventing -sqlserver $args[0] -dbname $args[1]  -filepath $args[2] -relocatefiles $args[3] -force } -ArgumentList $server, $Dbname ,$filepath ,$Realocatefiles

Ответы [ 3 ]

1 голос
/ 15 июня 2011

Фоновые задания выполняются в другом пространстве выполнения.Таким образом, все, что вы выводите, не будет отображаться на консоли.Вы можете изменить свой код, чтобы сделать это.Проверьте это, например,

$server = "."
$dbname = "TestPoshEventing_6"
$filepath = "c:\temp\backup\TestPoshEventing.bak"
$Realocatefiles = @{TestPoshEventing='c:\temp\restore\TestPoshEventing_6.mdf';TestPoshEventing_log='c:\temp\restore\TestPoshEventing_6.ldf'}
$job = Start-Job -Name "Restore1" -InitializationScript  {Import-Module c:\temp\testes\PoshTest.psm1 -Force} -scriptblock { Invoke-SqlRestoreEventing -sqlserver $args[0] -dbname $args[1]  -filepath $args[2] -relocatefiles $args[3] -force } -ArgumentList $server, $Dbname ,$filepath ,$Realocatefiles

Wait-Job $job | Receive-Job

Используя Receieve-Job после завершения фонового задания, вы можете увидеть вывод вашего register-ObjectEvent.

0 голосов
/ 15 июня 2011

Я почти уверен, что это проблема масштаба. Когда вы запускаете Register-ObjectEvent в задании, вы создаете новую область действия, фактически новое пространство выполнения. Область действия заканчивается, как только команда завершается. Исходя из того, что вы опубликовали, я думаю, что ваша работа запускается из резервной копии, но область, в которой регистрируется событие, завершается до его завершения, поэтому при получении результатов работы вы ничего не получаете. Чтобы увидеть узел записи, вам нужно поддерживать область действия достаточно долго, чтобы получить событие. Или сделайте что-нибудь кроме Write-Host, например, запись файла журнала. Вот пример из одной из моих демонстраций:

Register-ObjectEvent -InputObject $ watcher -Eventname "Created" -SourceIdentifier "FolderChange" ` -MessageData "Новый файл создан" -Action { "$ (Get-Date) Был создан новый файл: $ ($ event.sourceEventArgs.fullpath)" | Out-File $ env: temp \ log.txt -append}

0 голосов
/ 15 июня 2011

Командлет Out-Null отправляет вывод в NULL, фактически удаляя его.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...