我执行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
答案 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