所以我实现了一个记录到数据库的功能
function write-logDB ($user,$message,$reason,$script,$dbConnection) {
$sql= "INSERT INTO ScriptLogging(Date_Time,Person,Message,Reason,Script)
VALUES (GETDATE(),'$user','$message','$reason','$script')"
$command = new-object -TypeName System.Data.OleDb.OleDbCommand
$command.Connection = $dbConnection
$command.CommandText = $sql
$command.ExecuteNonQuery()
}
此函数使用已打开的数据库连接来写入日志。当使用 ISE 运行此脚本时,打开此脚本会迭代每个用户,在数据库中记录必要的值。没问题。
但是如果此脚本通过任务计划程序运行(通过定时事件或手动右键单击并单击运行),脚本将失败,我将收到以下异常错误:
“ExecuteNonQuery 需要一个打开且可用的连接。该连接的当前状态已关闭。位于 CreateStudents 中的第 655 行 - MasterLog.ps1 函数 Main ExecuteNonQuery 需要一个打开且可用的连接。该连接的当前状态已关闭。位于 CreateStudents 中的第 655 行- MasterLog.ps1 功能主要”
这是我的日志记录功能的一部分。我不确定为什么在通过任务计划程序运行时连接会关闭。在出现错误之前它甚至不会迭代 2 个用户。
我已经确认并再次确认我通过任务管理器使用的帐户与手动运行时使用的帐户完全相同。我还确认了一百万次它指向正确的脚本..
我知道您可能对此没有答案,但即使帮助解决问题或我应该如何解决问题也将不胜感激。当脚本无法执行任务调度程序时,我得到的唯一数据是我上面发布的错误代码。
提前致谢。
我希望您可以在调用 ExecuteNonQuery 之前尝试打开连接。你可以尝试下面..
function write-logDB ($user,$message,$reason,$script,$dbConnection) {
$sql= "INSERT INTO ScriptLogging(Date_Time,Person,Message,Reason,Script)
VALUES (GETDATE(),'$user','$message','$reason','$script')"
$command = new-object -TypeName System.Data.OleDb.OleDbCommand
$command.Connection = $dbConnection
$command.CommandText = $sql
if ($dbConnection.State -eq [System.Data.ConnectionState]'Closed')
{
$dbConnection.Open()
Write-Output "Connection Opened Successfully.."
}
else
{
Write-Output "Connection already Opened.."
}
$command.ExecuteNonQuery()
}