2017-09-27 6 views
-1

私はpowershellファイルを実行するSQLストアドプロシージャを持っており、powershellファイルの実行中に発生したエラーをSQLテーブルに記録したい。SQLストアドプロシージャによって呼び出されたPowerShellスクリプトからSQLテーブルにエラーを記録するにはどうすればよいですか?

マイSQLストアドプロシージャ:

CREATE PROCEDURE [dbo].[sp_RemoveEmptyFiles] 
    @filePath varchar(260) 

AS 

DECLARE @sql as varchar(4000) 
DECLARE @powershellFileLocation varchar(260) 

SET @powershellFileLocation = '\\MyComputerName\Files\Powershell\cleandirectory.ps1' 


SET @sql = 'powershell -c "& { . ' + @powershellFileLocation + '; clean-directory ' + @filePath + ' }"' 

EXEC master..xp_cmdshell @sql 

私のPowerShellスクリプト:スクリプトが成功した場合、今

function clean-directory { 
    param ([string]$path) 
    try 
    { 
     if ($path.Length -le 0 -or -not (test-path -literalPath $path)) { 
      throw [System.IO.FileNotFoundException] """$path"" not a valid file path." 
     } 

     # 
     # 
     # Clean directories here 
     # 
     # 
    } 
    catch 
    { 
     write-host $error 
    } 
} 

、それはNULLの出力を返し、0ザ・の戻り値その目標をそのcatchブロックをSQLテーブルに保存する何かに置き換えることです。

私の最初の(非効率的)な思考は、そのcatchブロックでSQLコマンドを呼び出すためにあるようなもの:

$commandText = "INSERT INTO ErrorLogTable (TimeStamp, ErrorMessage) VALUES ($(Get-Date), $error)" 
$command = $conn.CreateCommand() 
$command.CommandText = $commandText 
$command.ExecuteNonQuery() 

しかし、これはほとんどSQLに戻って接続it--行うための最善の方法のように思えるんサーバーからストアドプロシージャが呼び出され、新しいコマンドなどが作成されました。PowerShellスクリプト、ストアドプロシージャのファイルパス引数、およびSQLサーバーは別の場所にあるため、アクセス許可の問題を念頭に置く必要があります(そして、なぜ私はpowershellスクリプトからInvoke-Sqlcmdを呼び出すことを避けるために努力しているのですか)。

PowerShellファイルの出力をストアドプロシージャで取得し、そこからテーブルにエラーメッセージを保存する方法はありますか?

+0

私はコンソールに出力するためにあなたのPowerShellを変更し、この方法を使ってそれを取得することをお勧めします。 https://www.sqlservercentral.com/Forums/Topic188738-9-1.aspxそのように互いに独立して呼び出す2つのコンポーネントを持つのは悪い設計です。 –

答えて

0

Iはxp_cmdshellを使用しているので、私は、次のようにSQLスクリプトを変更することによって、その出力をキャプチャすることができ:

SET @sql = 'powershell -c "& { . ' + @powershellFileLocation + '; clean-directory ' + @filePath + ' }"' 

-- table to hold the output from the cmdshell 
CREATE TABLE #PowershellOutput ([Output] varchar(1000)) 

-- execute actual powershell script 
INSERT INTO #PowershellOutput ([Output]) EXEC master..xp_cmdshell @sql 

これは別個の行としてコンソールに送信された各ラインを捕捉します。 PowerShellからのエラーメッセージをキャプチャするのに最適な解決策ではないので、私はまだそれらをキャプチャするより良い方法を探しています。これらの行を1つの出力に結合するか、スタックトレース全体とは対照的に、powershellエラーだけをキャプチャするためのより良い方法を見つけます。

関連する問題