帮助进行Powershell事件

帮助进行Powershell事件,powershell,Powershell,我有一个使用“Microsoft.SqlServer.Management.Smo.restore”恢复sql server数据库的功能。在我输入的代码中有一个名为completed的事件 Register-ObjectEvent -InputObject $restore -EventName "Complete" -SourceIdentifier CompleteRestore -Action { Write-Host "Works"} | Out-Null 它工作正常,恢复完成时会

我有一个使用“Microsoft.SqlServer.Management.Smo.restore”恢复sql server数据库的功能。在我输入的代码中有一个名为completed的事件

 Register-ObjectEvent -InputObject $restore  -EventName "Complete" -SourceIdentifier CompleteRestore -Action { Write-Host "Works"} | Out-Null
它工作正常,恢复完成时会显示消息

当我运行function by Powershell作业时,恢复已完成,但消息未显示

你们能帮帮我吗

谢谢

我使用这段代码将函数作为作业运行,并且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

Out-Null cmdlet将输出发送到Null,实际上是将其删除。

Out-Null cmdlet将输出发送到Null,实际上是将其删除。

我非常确定这是一个作用域问题。在作业中运行Register ObjectEvent时,您正在创建一个新的作用域,实际上是一个新的运行空间。该命令完成后,该作用域立即终止。基于在您发布的内容中,我认为您的作业正在启动备份,但注册事件的作用域在它完成之前终止,因此当您收到作业结果时,您将一无所获。要查看写主机,您需要使作用域保持足够长的活动时间以接收事件。或者执行写主机以外的操作,例如写入日志文件。下面是一个示例n我的一个演示中的示例:

注册ObjectEvent-InputObject$watcher-Eventname“已创建”-SourceIdentifier“FolderChange”` -MessageData“已创建新文件”-操作{ “$(获取日期)创建了一个新文件:$($event.sourceEventArgs.fullpath)”
输出文件$env:temp\log.txt-append}

我很确定这是一个范围问题。在作业中运行Register ObjectEvent时,实际上是在创建一个新的范围,一个新的运行空间。该范围在命令完成后立即终止。根据您发布的内容,我认为您的作业正在启动备份,但注册事件的范围在完成之前终止,因此当如果收到作业结果,您将一无所获。要查看写入主机,您需要使作用域保持足够长的活动时间以接收事件。或者执行写入主机以外的操作,例如写入日志文件。以下是我的一个演示中的示例:

注册ObjectEvent-InputObject$watcher-Eventname“已创建”-SourceIdentifier“FolderChange”` -MessageData“已创建新文件”-操作{ “$(获取日期)创建了一个新文件:$($event.sourceEventArgs.fullpath)”
Out文件$env:temp\log.txt-append}

后台作业在不同的运行空间中运行。因此,您在那里输出的任何内容都不会显示在控制台上。您可以修改代码来执行此操作。例如,检查此项

$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

通过在后台作业完成时使用
receivejob
,您可以看到
register ObjectEvent

后台作业的输出在不同的运行空间中运行。因此,您在那里输出的任何内容都不会出现在控制台上。您可以修改代码来执行此操作。例如,检查此项

$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

通过在后台作业完成时使用
receivejob
,您可以看到
register ObjectEvent

的输出,因此您将“还原功能”放在作业中,并在启动作业的控制台中运行register ObjectEvent?谢谢Marco,没有,register ObjectEvent在函数中。因此您将还原作业中的“函数”,并在启动作业的控制台中运行Register ObjectEvent?谢谢Marco,没有。Register ObjectEvent在函数中。实际上,Out Null不显示关于..的信息,如果我没有运行作业,则可以正常工作。实际上Out Null不显示关于..的信息,如果我没有运行作业,则可以正常工作。