私は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ファイルの出力をストアドプロシージャで取得し、そこからテーブルにエラーメッセージを保存する方法はありますか?
私はコンソールに出力するためにあなたのPowerShellを変更し、この方法を使ってそれを取得することをお勧めします。 https://www.sqlservercentral.com/Forums/Topic188738-9-1.aspxそのように互いに独立して呼び出す2つのコンポーネントを持つのは悪い設計です。 –