Powershell ODP.NET在命令shell中工作,但作为计划任务失败(Windows Server 2012 R2)

Powershell ODP.NET在命令shell中工作,但作为计划任务失败(Windows Server 2012 R2),powershell,scheduled-tasks,odp.net,windows-server-2012-r2,Powershell,Scheduled Tasks,Odp.net,Windows Server 2012 R2,尝试运行使用Oracle.DataAccess.dll程序集运行PowerShell脚本的计划任务时,会引发以下错误 新对象:使用“0”参数调用“.ctor”时发生异常:“Oracle.DataAccess.Client.OracleConnection”的类型初始值设定项引发异常。” 在PowerShell窗口中,在同一用户正常工作的情况下运行与计划任务相同的操作和参数 我已尝试使用[System.Reflection.Assembly]::LoadFile,添加类型-AssemblyName

尝试运行使用Oracle.DataAccess.dll程序集运行PowerShell脚本的计划任务时,会引发以下错误

新对象:使用“0”参数调用“.ctor”时发生异常:“Oracle.DataAccess.Client.OracleConnection”的类型初始值设定项引发异常。”

在PowerShell窗口中,在同一用户正常工作的情况下运行与计划任务相同的操作和参数

我已尝试使用
[System.Reflection.Assembly]::LoadFile
添加类型-AssemblyName
添加类型-Path


计划任务和PowerShell窗口之间有哪些差异可能导致此问题?

我多次遇到此问题。对我来说,这是因为没有加载Oracle DLL(路径和用户可能不同)

首先:有一段时间,Oracle编辑了一篇文章。因此,我停止使用需要安装Oracle软件包的本机odp.net。现在在我使用的每个脚本中:

# Download the package if it's not on the disk    
$version = '18.3.0'
try
{
  if (! $(Test-Path ".\NugetPackages\Oracle.ManagedDataAccess.$version\lib\net40\Oracle.ManagedDataAccess.dll"))
  {
    $ManagedDataAccess = Install-Package Oracle.ManagedDataAccess -Destination ".\NugetPackages" -Force -Source 'https://www.nuget.org/api/v2' -ProviderName NuGet -RequiredVersion $version -ErrorAction SilentlyContinue
  }
  Add-Type -Path ".\NugetPackages\Oracle.ManagedDataAccess.$version\lib\net40\Oracle.ManagedDataAccess.dll"
}
catch [System.Management.Automation.ParameterBindingException]
{
  $global:OracleError = New-Object PSCustomObject -Property @{"StackTrace"=$_.ScriptStackTrace;"Detail" = "Ligne $($_.InvocationInfo.ScriptLineNumber) : $($_.exception.message)";"TimeStamp"=([datetime]::Now)}
  $log = $null
}

# Connexion
$oraConn= New-Object Oracle.ManagedDataAccess.Client.OracleConnection (($compConStr)
$oraConn.Open()

# Requête SQL
$sql1 = @"
SELECT XX_MYSESSION_ID FROM XX_SILOGIXWSLOG 
  WHERE xx_name='customer_log'
  AND xx_param_4 IS NOT NULL
"@

$command1 = New-Object Oracle.ManagedDataAccess.Client.OracleCommand($sql1,$oraConn)

# Execution
$reader1=$command1.ExecuteReader()

$n = 0
while ($reader1.read())
{
  $reader1["XX_MYSESSION_ID"]  
}

# Close the conexion
$reader1.Close()
$oraConn.Close()
Second:我使用以下代码片段来发现脚本目录,它适用于正常和计划的作业(您可以为计划的任务修改它)


我工作场所的防火墙和代理设置意味着无法下载NuGet软件包。但是如果问题出在DLL上,脚本会在shell窗口中运行吗?响应是Yes my scripts,它在shell中运行,并且在计划任务中遇到问题。你可以从下载。小心,这些东西有点不一样。
# Discover the Directory script
$scriptDirectory = $(Split-Path -parent $PSCommandPath)
if ($scriptDirectory -eq $null -or $scriptDirectory -eq "")
{
  $scriptDirectory = split-path -parent $((Get-ScheduledJob -Name 'RMAWarning').Command)
}