2016-09-29 11 views
1

PowerShellスクリプトを実行して、Office365でフォルダと受信トレイルールを作成します。SQL ServerからPowershellスクリプトを実行 - バックグラウンドジョブを実行すると動作しなくなる

SQL Serverから呼び出されたときにスクリプトは正常に動作します。

しかし、私はStart-Jobと機能との通話でコードを置けば、それは、SQL Serverから作業を停止する - (?)が、ローカルマシンから実行された場合、それは動作します

私は実際にそれので、バックグラウンドで実行するコードをしたいです完了まで2〜3分かかります。

私が間違っていることについてのご意見はありますか?

これは、SQL Serverから動作するコードです:

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

-- CODE HERE -- 

-- End of file 

これは、(SQLから動作しますが、ローカルマシン/サーバからの作品はありません)のScriptBlockと私のコードです:

むしろ
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

SQL ServerからPowerShellスクリプトをどのように呼び出すのですか?スクリプトが機能しないときにエラーメッセージはありますか? ---- - ID名前PSJobTypeName州HasMoreData場所 : –

+0

セット_at_cmd = 'PowerShellの "D:\ PS \ NewProject.ps1"' +」 '+ _at_folder 幹部master.dbo.xp_cmdshellは SQL出力を_at_cmd ------------- ----- ----------- -------- 1 Job1 BackgroundJob Running True localhost 多分許可ですエラー? – methosmen

+0

* Sql Server *を使用して* Office365ルールを作成する*はちょっと個人的なアプローチです。タスクスケジューラを代わりに使うこともできますか? – vonPryz

答えて

0

PowerShellジョブを使用してスクリプトを非同期に処理するよりも、作成するO365フォルダ名をデータベースのテーブルに追加し、PowerShellスクリプトを実行するSQL Serverエージェントジョブを駆動するのが一般的です。 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 
+0

ありがとうございました! ワンステップで近いようです。 'Start-Sleep -s 300 #sleep 5 mins 'を使用しているときにスクリプトが実際に動作する スリープ期間が2秒の場合は動作しません。 – methosmen

+0

@methosmen - 実行中のPSジョブジョブの状態にかかわらず、親 'xp_cmdshell'コマンドが終了すると終了します。 5分の待機時間を追加すると、作業時間が完了します。それに基づいて、コマンドを非同期で実行することはできません。同期を実行して数分かかることを受け入れるか、別のプロセスを使用してキューを処理してスクリプトをトリガする必要があります(SQL Serverエージェント)。 –

関連する問題