Files
ROMFASTSQL/proxmox/lxc108-oracle/roa-windows-setup/scripts/11-setup-backup-export.ps1
Marius 91e822eb53 fix(export): aliasul TNS lipsa facea exportul zilnic sa esueze tacut
La VADECO, backupora.exe rula in fiecare noapte, se termina cu cod 0 si scria
"DONE" pentru fiecare schema - dar directorul zilei ramanea gol. Intre 25 si
28.08.2026 nu a existat niciun export.

Cauza: schema.txt cere "@XEPDB1", iar 01-setup-database.ps1 scria in tnsnames.ora
doar aliasul ROA. expdp cadea instant cu ORA-12154, iar backupora.exe nu-i
verifica codul de iesire. Doua scripturi din acelasi kit nu erau de acord asupra
numelui bazei, si nimic nu tipa.

Indiciul din log, daca reapare: fiecare schema dura exact 16 secunde, indiferent
de marime. Timp uniform = expdp moare la conectare, nu exporta.

Reparatii, ca sa nu se repete la alt client:

- 01-setup-database.ps1 scrie acum doua aliasuri, ROA si numele serviciului,
  in ambele tnsnames.ora. Curatarea dinaintea rescrierii parcurge fiecare alias
  gestionat de noi, altfel al doilea s-ar dubla la fiecare rulare. Aliasurile
  generate de Oracle (XE, LISTENER_XE, ORACLR_CONNECTION_DATA) raman neatinse.

- 11-setup-backup-export.ps1 face tnsping inainte de a scrie schema.txt si
  opreste instalarea daca aliasul nu se rezolva. Mai bine o instalare care se
  plange decat un backup care nu exista.

- lectii-actualizare-roa-alias-tns.md capata sectiunea despre a doua victima a
  aceleiasi cauze. Lectia generala: unde un script lanseaza un proces extern
  Oracle, verifica efectul, nu raportul procesului care l-a lansat.

Include si blocul NTS din config/sqlnet.ora, ramas necomis: autentificarea OS
cere si apartenenta la ORA_OraDB21Home1_DBA, si setarea din sqlnet.ora.

Nota: CLAUDE.md apare ca modificat integral - blob-ul din git avea CRLF, iar
core.autocrlf=true il normalizeaza la LF. Modificarea reala e o singura linie.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01X9Sa54oFKpE2XhD6A7NTch
2026-08-28 17:12:41 +03:00

554 lines
22 KiB
PowerShell

#Requires -Version 5.1
<#
.SYNOPSIS
Pregateste exportul zilnic al bazei: D:\ROA\EXPORT_ORADMP cu backupora.exe,
setari.ini, schema.txt si task-ul zilnic din Windows Task Scheduler.
.DESCRIPTION
Ce face, in ordine:
1. Creeaza D:\ROA\EXPORT_ORADMP (+ subdirectorul LOG).
2. Copiaza backupora.exe si config.fpw din kit (backup\).
3. Genereaza setari.ini din backup\setari.ini.template, inlocuind
marcajele {{...}} cu valorile reale ale instalarii.
4. Genereaza schema.txt cu schemele de exportat, in formatul cerut de
backupora.exe: SCHEMA;PAROLA@SERVICIU, cate una pe linie.
CONTAFIN_ORACLE + firmele active din CONTAFIN_ORACLE.NOM_FIRME
(parolele se citesc din NOM_FIRME.parola).
Alternativ, il copiaza de pe serverul vechi (-SchemaFromPath).
5. Creeaza obiectul Oracle DIRECTORY BACKUP_ORACLE catre acelasi
director, ca Data Pump sa poata scrie acolo, si da drepturi
serviciului Oracle pe folder.
6. Inregistreaza un task zilnic in Windows Task Scheduler.
Formatul lui setari.ini NU e cimentat in cod: sablonul e un fisier de
date, iar scriptul doar substituie marcajele.
ATENTIE la doua capcane ale lui backupora.exe, verificate in sursa lui
(main.prg):
- programul SCRIE in ini-ul implicit cheia "delete_backups_olther_xdays"
(cu typo) dar CITESTE "delete_backups_older_xdays". Sablonul o are pe
cea corecta. Nu o "corecta" inapoi.
- alege intre exportul clasic si Data Pump dupa NUMELE executabilului din
oracleexpfile. Ca sa foloseasca expdp, fisierul trebuie sa se cheme
"expdp.exe"; de aceea aratam catre <OracleHome>\bin\expdp.exe.
Dump-urile ajung in <BackupPath>\<AAAALLZZ>\ - backupora.exe creeaza singur
subdirectorul pe zi.
.PARAMETER ExportPath
Directorul in care sta backupora.exe. Implicit D:\ROA\EXPORT_ORADMP.
.PARAMETER BackupPath
Unde ajung dump-urile. Implicit acelasi cu ExportPath, deci
D:\ROA\EXPORT_ORADMP\<AAAALLZZ>\. Pe instalarile mai vechi de la clienti
valoarea uzuala e C:\BACKUP_ORACLE - daca vrei sa pastrezi conventia aia,
da-o explicit.
.PARAMETER ContafinPassword
Parola CONTAFIN_ORACLE, pentru linia lui din schema.txt.
Implicit ROMFASTSOFT.
.PARAMETER OracleHome
Oracle home. Autodetectat daca lipseste.
.PARAMETER ServiceName
Serviciul bazei. Implicit XEPDB1.
.PARAMETER SystemPassword
Parola SYSTEM/SYS. Implicit romfastsoft.
.PARAMETER SchemaFromPath
Cale (locala sau UNC) catre un schema.txt existent, de regula de pe
serverul vechi: \\server-vechi\d$\ROA\EXPORT_ORADMP\schema.txt
Daca e dat si fisierul e citibil, se copiaza in loc sa se genereze.
.PARAMETER RetentionDays
Cate zile se pastreaza dump-urile. Ajunge in setari.ini. Implicit 7.
.PARAMETER TaskTime
Ora rularii zilnice, format HH:mm. Implicit 22:30.
.PARAMETER TaskName
Numele task-ului din Task Scheduler. Implicit "ROA Export Oracle".
.PARAMETER TaskUser
Contul sub care ruleaza task-ul. Implicit SYSTEM.
.PARAMETER SkipTask
Nu crea task-ul zilnic; doar directorul, fisierele si obiectul DIRECTORY.
.PARAMETER SkipSchema
Nu genera si nu copia schema.txt (il completezi manual dupa).
.PARAMETER SchemaOnly
Regenereaza doar schema.txt si iese. Nu atinge setari.ini, backupora.exe
sau task-ul. Asa se reia pasul dupa faza 2, cand firmele exista in
NOM_FIRME, fara sa pierzi corecturile facute manual in setari.ini.
.EXAMPLE
.\11-setup-backup-export.ps1
Varianta obisnuita, cu schema.txt generat din NOM_FIRME.
.EXAMPLE
.\11-setup-backup-export.ps1 -SchemaFromPath "\\10.0.0.5\d$\ROA\EXPORT_ORADMP\schema.txt"
Preia schema.txt de pe serverul vechi, exact cum era acolo.
.EXAMPLE
.\11-setup-backup-export.ps1 -TaskTime "23:00" -RetentionDays 14
Alta ora si alta retentie.
.NOTES
File Name : 11-setup-backup-export.ps1
Prerequisite : drepturi de administrator; backup\backupora.exe prezent in kit
Copyright 2026 : ROMFAST
#>
[CmdletBinding()]
param(
[Parameter(Mandatory = $false)]
[string]$ExportPath = "D:\ROA\EXPORT_ORADMP",
[Parameter(Mandatory = $false)]
[string]$BackupPath,
[Parameter(Mandatory = $false)]
[string]$ContafinPassword = "ROMFASTSOFT",
[Parameter(Mandatory = $false)]
[string]$OracleHome,
[Parameter(Mandatory = $false)]
[string]$ServiceName = "XEPDB1",
[Parameter(Mandatory = $false)]
[string]$SystemPassword = "romfastsoft",
[Parameter(Mandatory = $false)]
[string]$SchemaFromPath,
[Parameter(Mandatory = $false)]
[int]$RetentionDays = 7,
[Parameter(Mandatory = $false)]
[ValidatePattern('^\d{1,2}:\d{2}$')]
[string]$TaskTime = "22:30",
[Parameter(Mandatory = $false)]
[string]$TaskName = "ROA Export Oracle",
[Parameter(Mandatory = $false)]
[string]$TaskUser = "SYSTEM",
[Parameter(Mandatory = $false)]
[switch]$SkipTask,
[Parameter(Mandatory = $false)]
[switch]$SkipSchema,
[Parameter(Mandatory = $false)]
[switch]$SchemaOnly
)
$ErrorActionPreference = "Stop"
. (Join-Path $PSScriptRoot "lib\logging-functions.ps1")
. (Join-Path $PSScriptRoot "lib\oracle-functions.ps1")
$configFile = Join-Path $PSScriptRoot "..\config.ps1"
if (Test-Path $configFile) {
. $configFile
if (-not $PSBoundParameters.ContainsKey('OracleHome') -and $Config.OracleHome) { $OracleHome = $Config.OracleHome }
if (-not $PSBoundParameters.ContainsKey('ServiceName') -and $Config.ServiceName) { $ServiceName = $Config.ServiceName }
if (-not $PSBoundParameters.ContainsKey('SystemPassword') -and $Config.SystemPassword) { $SystemPassword = $Config.SystemPassword }
}
$stamp = Get-Date -Format 'yyyyMMdd_HHmmss'
$logDir = Join-Path $PSScriptRoot "..\logs"
if (-not (Test-Path $logDir)) { New-Item -ItemType Directory -Path $logDir -Force | Out-Null }
Initialize-LogFile -LogPath (Join-Path $logDir "11-setup-backup-export_$stamp.log") -ScriptName "11-setup-backup-export.ps1"
$kitBackupDir = Join-Path $PSScriptRoot "..\backup"
function Test-Administrator {
$identity = [Security.Principal.WindowsIdentity]::GetCurrent()
$principal = New-Object Security.Principal.WindowsPrincipal($identity)
return $principal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)
}
<#
Scrie schema.txt: lista schemelor pe care le exporta backupora.exe.
Fie copiaza fisierul de pe serverul vechi, fie il genereaza din
CONTAFIN_ORACLE.NOM_FIRME. Se apeleaza si din fluxul complet, si din
-SchemaOnly (reluarea de dupa faza 2, cand firmele exista).
#>
function New-SchemaFile {
param(
[string]$SchemaFile,
[string]$SourcePath,
[string]$OraHome,
[string]$Service,
[string]$Password,
[string]$ContafinPwd
)
Write-LogSection "schema.txt"
# Verificarea care lipsea si care a costat, la VADECO, patru zile de export
# gol (28.08.2026): sirul de conectare scris in schema.txt trebuie sa se
# REZOLVE. Daca aliasul nu exista in tnsnames.ora, expdp cade instant cu
# ORA-12154, nu scrie niciun DMP - dar backupora.exe logheaza TOTUSI "DONE"
# pentru fiecare schema si creeaza directorul zilei, gol. Esecul e complet
# tacut: nicio alarma, doar backup-uri care nu exista.
# De aceea aici oprim zgomotos, inainte ca fisierul sa apuce sa fie folosit.
$tnsping = Join-Path $OraHome "bin\tnsping.exe"
if (Test-Path $tnsping) {
$iesireTns = & $tnsping $Service 2>&1 | Out-String
if ($LASTEXITCODE -ne 0 -or $iesireTns -match 'TNS-\d') {
Write-LogError "Aliasul TNS '$Service' NU se rezolva."
Write-LogError "schema.txt cere '@$Service', deci expdp ar cadea cu ORA-12154 la fiecare"
Write-LogError "rulare, iar backupora.exe ar raporta oricum 'DONE'. Exportul zilnic ar fi gol."
Write-LogError "Repara: ruleaza 01-setup-database.ps1 (scrie aliasul in tnsnames.ora)"
Write-LogError "sau da un -ServiceName care se rezolva."
throw "Aliasul TNS '$Service' nu se rezolva - schema.txt ar produce un export gol."
}
Write-LogSuccess "Aliasul TNS '$Service' se rezolva - expdp se va putea conecta."
}
else {
Write-LogWarning "Nu gasesc tnsping.exe in $OraHome\bin; sar peste verificarea aliasului '$Service'."
Write-LogWarning "Verifica manual ca '@$Service' se rezolva, altfel exportul zilnic va fi gol."
}
if ($SourcePath) {
if (Test-Path $SourcePath) {
Copy-Item -Path $SourcePath -Destination $SchemaFile -Force
$n = @(Get-Content $SchemaFile | Where-Object { $_.Trim() -ne '' }).Count
Write-LogSuccess "Copiat de pe serverul vechi: $n linii"
Write-LogWarning "Verifica-l: parolele si numele serviciului din el sunt cele de pe"
Write-LogWarning "serverul VECHI. Daca difera, corecteaza-le sau regenereaza cu -SchemaOnly."
return
}
Write-LogWarning "Nu pot citi $SourcePath. Generez schema.txt din NOM_FIRME."
}
Write-Log "Citesc schemele si parolele din CONTAFIN_ORACLE.NOM_FIRME..."
# Formatul cerut de backupora.exe (vezi schema.tmpl):
# SCHEMA;PAROLA@SERVICIU
# Delimitatorul e ';', nu '|' - alegem alt separator la SELECT ca sa nu se
# confunde daca o parola ar contine ';'.
$sql = @"
SET PAGESIZE 10000 FEEDBACK OFF VERIFY OFF HEADING OFF ECHO OFF LINESIZE 500
SELECT schema || '~' || parola
FROM CONTAFIN_ORACLE.NOM_FIRME
WHERE sters = 0
AND schema IS NOT NULL
ORDER BY schema;
EXIT
"@
$rez = Invoke-SqlPlus -OracleHome $OraHome -ServiceName $Service `
-Username "SYSTEM" -Password $Password -SqlCommand $sql -Silent
$firme = @()
foreach ($linie in ($rez -split "`n")) {
$linie = $linie.Trim()
if ($linie -match '^([A-Z0-9_]+)~(.*)$') {
$schema = $Matches[1]
$parola = $Matches[2].Trim()
if (-not $parola) { $parola = "ROMFASTSOFT" }
$firme += "$schema;$parola@$Service"
}
}
# CONTAFIN_ORACLE nu e in NOM_FIRME, dar trebuie exportat primul: fara el,
# dump-urile de firma nu se pot reimporta (NOM_FIRME tine parolele si
# maparea firma -> schema).
$linii = @("CONTAFIN_ORACLE;$ContafinPwd@$Service") + ($firme | Sort-Object -Unique)
Set-Content -Path $SchemaFile -Value ($linii -join "`r`n") -Encoding ASCII
Write-LogSuccess "Generat: $SchemaFile (CONTAFIN_ORACLE + $($firme.Count) firme)"
Write-LogWarning "Fisierul contine parole in clar - asa il cere backupora.exe."
Write-LogWarning "Nu il copia in afara serverului si nu il pune in kit."
if ($firme.Count -eq 0) {
Write-LogWarning "NOM_FIRME nu are nicio firma activa."
Write-LogWarning "In faza 1 e normal - reia cu -SchemaOnly dupa faza 2."
}
}
try {
Write-LogSection "Export zilnic Oracle (EXPORT_ORADMP)"
# -SchemaOnly nu scrie in Task Scheduler, deci nu cere administrator.
if (-not $SchemaOnly -and -not (Test-Administrator)) {
throw "Scriptul are nevoie de drepturi de administrator (creeaza un task in Task Scheduler)."
}
$oraHome = Get-OracleHome -OracleHome $OracleHome
Write-LogSuccess "Oracle Home: $oraHome"
if (-not $BackupPath) { $BackupPath = $ExportPath }
Write-Log "Director program: $ExportPath"
Write-Log "Dump-uri in: $BackupPath\<AAAALLZZ>\"
# ------------------------------------------------------------------
# Reluare doar pentru schema.txt (dupa faza 2, cand firmele exista).
# Nu atinge setari.ini, backupora.exe sau task-ul.
# ------------------------------------------------------------------
if ($SchemaOnly) {
if (-not (Test-Path $ExportPath)) {
throw "$ExportPath nu exista. Ruleaza intai scriptul fara -SchemaOnly."
}
New-SchemaFile -SchemaFile (Join-Path $ExportPath "schema.txt") -SourcePath $SchemaFromPath `
-OraHome $oraHome -Service $ServiceName -Password $SystemPassword `
-ContafinPwd $ContafinPassword
Write-LogSection "Gata (SchemaOnly)"
Close-LogFile
exit 0
}
# ------------------------------------------------------------------
# 1. Directoare
# ------------------------------------------------------------------
Write-LogSection "Directoare"
$drive = Split-Path -Qualifier $ExportPath
if ($drive -and -not (Test-Path $drive)) {
throw "Discul $drive nu exista. Da alta cale cu -ExportPath."
}
$logSubDir = Join-Path $ExportPath "LOG"
foreach ($d in @($ExportPath, $logSubDir, $BackupPath)) {
if (-not (Test-Path $d)) {
New-Item -ItemType Directory -Path $d -Force | Out-Null
Write-LogSuccess "Creat: $d"
} else {
Write-Log "Exista: $d"
}
}
# Data Pump scrie cu contul serviciului Oracle, nu cu al tau. Fara
# dreptul asta, expdp da ORA-39002 la deschiderea fisierului.
$oracleServices = @(Get-Service -Name "Oracle*XE*" -ErrorAction SilentlyContinue |
Where-Object { $_.Name -like "OracleService*" })
foreach ($svc in $oracleServices) {
$cont = "NT SERVICE\$($svc.Name)"
foreach ($tinta in (@($ExportPath, $BackupPath) | Select-Object -Unique)) {
$null = & icacls.exe $tinta /grant "${cont}:(OI)(CI)F" /T /Q 2>&1
if ($LASTEXITCODE -eq 0) {
Write-LogSuccess "Drepturi depline pentru $cont pe $tinta"
} else {
Write-LogWarning "icacls pentru $cont pe $tinta a returnat codul $LASTEXITCODE"
}
}
}
if ($oracleServices.Count -eq 0) {
Write-LogWarning "Nu am gasit niciun serviciu OracleService*. Verifica manual drepturile pe $ExportPath."
}
# ------------------------------------------------------------------
# 2. backupora.exe + config.fpw
# ------------------------------------------------------------------
# config.fpw e configul runtime VFP (SCREEN=OFF, RESOURCE=OFF). Fara el,
# backupora.exe ar deschide o fereastra si ar astepta - inacceptabil
# pentru un task programat care ruleaza fara sesiune interactiva.
Write-LogSection "backupora.exe"
$tintaExe = Join-Path $ExportPath "backupora.exe"
foreach ($fis in @('backupora.exe', 'config.fpw', 'setari.ini.tmpl', 'schema.tmpl', 'changelog_backupora.txt')) {
$sursa = Join-Path $kitBackupDir $fis
$tinta = Join-Path $ExportPath $fis
if (Test-Path $sursa) {
Copy-Item -Path $sursa -Destination $tinta -Force
$dim = [math]::Round((Get-Item $tinta).Length / 1KB, 1)
Write-LogSuccess "Copiat: $fis ($dim KB)"
}
elseif ($fis -eq 'backupora.exe') {
if (Test-Path $tinta) {
Write-LogWarning "backup\backupora.exe lipseste din kit, dar exista deja $tinta. Il las cum e."
}
else {
Write-LogError "Lipseste backup\backupora.exe din kit SI din $ExportPath."
Write-LogError "Fara el, task-ul zilnic nu are ce rula."
Write-LogError "Pune backupora.exe in kit, in directorul backup\, si reconstruieste kitul."
throw "backupora.exe lipseste."
}
}
else {
Write-LogDebug "backup\$fis lipseste din kit - optional, se continua."
}
}
# ------------------------------------------------------------------
# 3. setari.ini
# ------------------------------------------------------------------
Write-LogSection "setari.ini"
$sablon = Join-Path $kitBackupDir "setari.ini.template"
$tintaIni = Join-Path $ExportPath "setari.ini"
if (-not (Test-Path $sablon)) {
throw "Lipseste backup\setari.ini.template din kit."
}
if (Test-Path $tintaIni) {
$backupIni = Join-Path $ExportPath "setari.ini.bak_$stamp"
Copy-Item -Path $tintaIni -Destination $backupIni -Force
Write-LogWarning "setari.ini exista deja; l-am salvat ca $(Split-Path -Leaf $backupIni) inainte sa il rescriu."
}
# backupora.exe alege exp vs expdp dupa numele executabilului, deci
# aratam direct catre expdp.exe din Oracle home. Stub-ul de 0 octeti din
# directorul programului (asa apare pe instalarile vechi) nu ar exporta nimic.
$expdpExe = Join-Path $oraHome "bin\expdp.exe"
if (-not (Test-Path $expdpExe)) {
Write-LogWarning "Nu gasesc $expdpExe. Verifica manual cheia oracleexpfile din setari.ini."
}
# Calea fizica a directorului Oracle DMPDIR, pentru cheile datapumpdir*.
$dmpDirPath = "C:\DMPDIR"
$dmpDirName = "DMPDIR"
try {
$r = Invoke-SqlPlus -OracleHome $oraHome -ServiceName $ServiceName `
-Username "sys" -Password $SystemPassword -AsSysdba -Silent -SqlCommand @"
SET PAGESIZE 0 FEEDBACK OFF HEADING OFF VERIFY OFF
SELECT 'DMPDIR=' || directory_path FROM dba_directories WHERE directory_name = 'DMPDIR';
EXIT
"@
if ($r -match 'DMPDIR=(.+)') { $dmpDirPath = $Matches[1].Trim() }
}
catch {
Write-LogDebug "Nu am putut citi DMPDIR: $($_.Exception.Message)"
}
$schemaFile = Join-Path $ExportPath "schema.txt"
$inlocuiri = @{
'{{ORACLE_HOME}}' = $oraHome
'{{DB_SERVICE}}' = $ServiceName
'{{EXPORT_DIR}}' = $ExportPath
'{{BACKUP_PATH}}' = $BackupPath
'{{SCHEMA_FILE}}' = $schemaFile
'{{RETENTION_DAYS}}' = "$RetentionDays"
'{{EXPDP_EXE}}' = $expdpExe
'{{DMPDIR_PATH}}' = $dmpDirPath
'{{DMPDIR_NAME}}' = $dmpDirName
'{{DATA_GENERARII}}' = (Get-Date -Format 'yyyy-MM-dd HH:mm:ss')
}
$continut = Get-Content -Path $sablon -Raw
foreach ($cheie in $inlocuiri.Keys) {
$continut = $continut.Replace($cheie, $inlocuiri[$cheie])
}
Set-Content -Path $tintaIni -Value $continut -Encoding ASCII
Write-LogSuccess "Generat: $tintaIni"
$ramase = [regex]::Matches($continut, '\{\{[A-Z_]+\}\}')
if ($ramase.Count -gt 0) {
$lista = ($ramase | ForEach-Object { $_.Value } | Select-Object -Unique) -join ", "
Write-LogWarning "Marcaje nesubstituite in setari.ini: $lista"
Write-LogWarning "Completeaza-le manual sau adauga-le in tabelul de inlocuiri din scriptul asta."
}
# ------------------------------------------------------------------
# 4. schema.txt
# ------------------------------------------------------------------
if (-not $SkipSchema) {
New-SchemaFile -SchemaFile $schemaFile -SourcePath $SchemaFromPath `
-OraHome $oraHome -Service $ServiceName -Password $SystemPassword `
-ContafinPwd $ContafinPassword
}
else {
Write-Log "Sar peste schema.txt (-SkipSchema). Completeaza-l manual in $ExportPath."
}
# ------------------------------------------------------------------
# 5. Obiectul Oracle DIRECTORY
# ------------------------------------------------------------------
Write-LogSection "Obiectul DIRECTORY BACKUP_ORACLE"
$dirSql = @"
SET FEEDBACK ON SERVEROUTPUT ON VERIFY OFF
CREATE OR REPLACE DIRECTORY BACKUP_ORACLE AS '$ExportPath';
GRANT READ, WRITE ON DIRECTORY BACKUP_ORACLE TO SYSTEM;
GRANT READ, WRITE ON DIRECTORY BACKUP_ORACLE TO CONTAFIN_ORACLE;
SET PAGESIZE 0 HEADING OFF FEEDBACK OFF
SELECT 'DIRECTORY=' || directory_path FROM dba_directories WHERE directory_name = 'BACKUP_ORACLE';
EXIT
"@
$rezDir = Invoke-SqlPlus -OracleHome $oraHome -ServiceName $ServiceName `
-Username "sys" -Password $SystemPassword -AsSysdba -SqlCommand $dirSql
if ($rezDir -match "DIRECTORY=(.+)") {
Write-LogSuccess "BACKUP_ORACLE -> $($Matches[1].Trim())"
} else {
Write-LogWarning "Nu am putut confirma obiectul DIRECTORY BACKUP_ORACLE."
Write-LogDebug $rezDir
}
# ------------------------------------------------------------------
# 6. Task zilnic
# ------------------------------------------------------------------
if (-not $SkipTask) {
Write-LogSection "Task zilnic in Windows Task Scheduler"
$existent = $null
try { $existent = Get-ScheduledTask -TaskName $TaskName -ErrorAction Stop } catch { }
if ($existent) {
Write-LogWarning "Task-ul '$TaskName' exista deja; il inlocuiesc."
Unregister-ScheduledTask -TaskName $TaskName -Confirm:$false
}
$actiune = New-ScheduledTaskAction -Execute $tintaExe -WorkingDirectory $ExportPath
$declansator = New-ScheduledTaskTrigger -Daily -At $TaskTime
$principal = New-ScheduledTaskPrincipal -UserId $TaskUser -LogonType ServiceAccount -RunLevel Highest
$setari = New-ScheduledTaskSettingsSet -AllowStartIfOnBatteries -DontStopIfGoingOnBatteries `
-StartWhenAvailable -ExecutionTimeLimit (New-TimeSpan -Hours 6)
Register-ScheduledTask -TaskName $TaskName -Action $actiune -Trigger $declansator `
-Principal $principal -Settings $setari `
-Description "Export zilnic al schemelor ROA in $ExportPath (backupora.exe)" | Out-Null
Write-LogSuccess "Task '$TaskName' creat, zilnic la $TaskTime, sub contul $TaskUser"
Write-Log "Rulare de proba: Start-ScheduledTask -TaskName ""$TaskName"""
Write-Log "Stare: Get-ScheduledTaskInfo -TaskName ""$TaskName"""
}
else {
Write-Log "Sar peste task-ul zilnic (-SkipTask)"
}
# ------------------------------------------------------------------
Write-LogSection "Gata"
Write-Log "Director program: $ExportPath"
Write-Log "Executabil: $tintaExe"
Write-Log "Config: $tintaIni"
if (-not $SkipSchema) { Write-Log "Scheme: $schemaFile" }
Write-Log "Dump-uri in: $BackupPath\<AAAALLZZ>\"
Write-Log "DIRECTORY: BACKUP_ORACLE"
if (-not $SkipTask) { Write-Log "Task zilnic: $TaskName la $TaskTime" }
Write-Log ""
Write-LogWarning "Verifica manual prima rulare inainte sa pleci de la client:"
Write-LogWarning " Start-ScheduledTask -TaskName ""$TaskName"""
Write-LogWarning "apoi uita-te in $logSubDir si vezi ca s-au scris dump-urile."
Close-LogFile
exit 0
}
catch {
Write-LogError $_.Exception.Message
Write-LogDebug $_.ScriptStackTrace
Close-LogFile
exit 1
}