从SQL Server执行的Powershell脚本 - 如果放到后台作业,则停止工作

时间:2016-09-29 18:37:33

标签: sql sql-server powershell

我执行PowerShell脚本以在Office365中创建文件夹和收件箱规则。

从SQL Server调用时,脚本运行正常。

但是,如果我将代码放入函数并使用Start-Job进行调用,那么它将从SQL Server停止工作 - 但是如果从本地计算机执行它会起作用(?)

我真的希望代码在后台运行,因为它需要2-3分钟才能完成。

关于我做错了什么建议?

这是从SQL Server运行的代码:

param( 
     [Parameter(Position=0, Mandatory=$true)] [string]$FolderName 
    )

-- CODE HERE --

-- End of file

这是我的ScriptBlock代码(不能从sql运行,但可以在本地机器/服务器上运行):

param( 
     [Parameter(Position=0, Mandatory=$true)] [string]$FolderName 
    )

$func = {function createFolderAndRule {
    param([string]$FolderName)
    #-- CODE HERE --

}
}


Start-Job -ScriptBlock {param($tm) createFolderAndRule $tm } -InitializationScript $func -ArgumentList($FolderName)
# End of file 

1 个答案:

答案 0 :(得分:0)

不是使用PowerShell作业异步处理脚本,更常规的方法可能是将要创建的O365文件夹名称添加到数据库中的表中,而后者又用于驱动SQL Server代理作业。执行PowerShell脚本。 SQL Server代理作业可以按计划轮询表以创建新文件夹。您可能仍需要从xp_cmdshell触发脚本,因为SQL Server代理作业步骤可以非常适合参数化。

如果您希望坚持使用您正在使用的方法,可能调试此方法的唯一方法是通过修改脚本来检索PowerShell作业的输出,以便它执行以下操作:

param( 
     [Parameter(Position=0, Mandatory=$true)] [string]$FolderName 
    )

$func = {function createFolderAndRule {
    param([string]$FolderName)
    #-- CODE HERE --
}
}


Start-Job -ScriptBlock {param($tm) createFolderAndRule $tm } -InitializationScript $func -ArgumentList($FolderName)

Start-Sleep -s 300 #sleep 5 mins

Receive-Job -Id 1 #retrieve the output of the PowerShell job

Remove-Job -Id 1