crusher79
Goto Top

PowerShell parallel Script Block schluckt erstes Objekt

Hallo,

für Backup Export aus Acronis Cyberbackup mittels acrocmd hol ich mir die arcuids und führe folgendes aus. Letzte Zeile des Return des Exports als Success-Indication.

WSUS wegen 3 TB soll raus. Bleibt es auch. Es sollten dann 41 von 42 Exportiert werden. Ich bekomm aber nur 40 heraus! Es gibt keine *.ERROR Datei oder Log Eintrag dazu.

Ginge vlt. noch schöner aber es läuft. Wenn es um 4 Uhr nachts startet wird parallel gut 1 TB in 2,5 Std. geschrieben. Auch OK soweit.

Nur es fehlt mir immer eine VM - das Archiv01. Ist aber so im Array mit drin. Wenn ich als Trockenübung nur ein "Out-File" jetzt mache und parallel statt des Exportes einfach eine TXT schreiben lassen, ist Archiv01 mit drin. Auch im Array is die arc_uid enthalten.

 $_ | Out-File -FilePath "d:\temp\test\$($_).txt"   

Es schlägt immer nur der Lauf in der Nacht via Taskplaner fehl.

Bei mehreren Blöcken kann man ja -Begin und -End auf $null setzen. Ich hab aber nur diesen einen Block. Es verhält sich nur nun fast so, als wenn das 1. Object in $null reinläuft. Hab es aber unten nicht so aufgebaut.

In VScode ist alles schön. Man bekommt jedes mal die 41 Dateien (sortiert nach letzten Backup/ Archiv Erstelldatum vor x-Monaten). Liege also nun immer beim 08. Mai. Wollte eh noch Log einbauen.

Hat jemand spontan eine Idee wieso es in VScode läuft, aber via pwsh.exe + Taskplaner das 1. Objekt immer raushaut?

$backupLoc="D:\Sicherungen\Acronis_CB_Local\"  
$expDir="D:\Sicherungen\Acronis_EXP\"  
$successMessage="The operation completed successfully."  
$DateValLen = $("_20240506_080135.ERROR").Length  
$dateFormat = 'dd.MM.yyyy HH:mm:ss'  
# "" Blank ALLE - Mehrach "aaa|bbb|ccc"  
$excludeUID = "WSUS"  
$includeUID = ""  
Function DetermineArcFailed() {
$Script:arc_failed = $(Get-ChildItem -Path $expDir -Filter "*.ERROR" | Where-Object { $_.LastWriteTime.Day -eq (Get-date).Day }).Name `  
| ForEach-Object { $_.ToString().Substring(0,$($_.ToString().Length-$DateValLen)) }
}

$arc_list = acrocmd list archives --loc=$backupLoc --output=raw --all
$arc_list_csv = ConvertFrom-CSV -Delimiter "`t" -InputObject $arc_list -Header "Name","Mode","Date","Appliance","User","Size","VM" | Where-Object { $_.Mode -eq 'disk' } `  
| Select-Object *,@{Name = 'DateTime'; Expression = {[datetime]::ParseExact($_.Date, $dateFormat, [cultureinfo]::InvariantCulture)}} -ExcludeProperty datetime   
$arc_list_csv_orderd = $arc_list_csv | Sort-Object -Property DateTime -Descending | Group-Object -Property 'VM' | ForEach-Object {$_.Group[0]}   

$arc_uid = $arc_list_csv_orderd.Name | Where-Object {$_ -notmatch "$excludeUID" -and $_ -match "$includeUID"}  

$acro_job = $arc_uid  | ForEach-Object -Parallel {        
        $expDirL=$using:expDir
        $backupLocL=$using:backupLoc
        $successMessageL=$using:successMessage
 
        $exportJob = acrocmd export backup --loc=$backupLocL --arc=$_ --target=$expDirL
        if ($($exportJob | Select-Object -Last 1) -eq $successMessageL) {
            $timeStamp=(Get-Date).ToString("yyyyMMdd_HHmmss")  
            $dateStamp=(Get-Date).ToString("yyyy_MM_dd")  
            Rename-Item -Path "$expDirL\$_.tibx" -NewName "$($_)_$timeStamp.tibx"    
            New-Item -Path "$expDirL\$($_)_$timeStamp.OK" -ItemType File         
        } ELSE { 
            New-Item -Path "$expDirL\$($_)_$timeStamp.ERROR" -ItemType File   
        } 
    } -ThrottleLimit 4 -AsJob

$acro_job

mfg Crusher

Content-ID: 72437228923

Url: https://administrator.de/forum/powershell-parallel-script-block-schluckt-erstes-objekt-72437228923.html

Ausgedruckt am: 22.12.2024 um 11:12 Uhr

Crusher79
Crusher79 09.05.2024 um 16:05:39 Uhr
Goto Top
Nachtrag:

Ohne -job geht es.

Wo ist mein Denkfehler? Als Subjob macht es Unsinn.

Aufruf via Taskplaner:
"C:\Program Files\PowerShell\7\pwsh.exe"
-File "C:\scripts\Acronis2Immutable.ps1"

Alles andere wie im Code oben. Testlauf mit der TXT Ausgabe liefert auch massive Lücken wenn "-job" gesetzt ist. Ohne "-job" geht es.

Wie richte ich den Job hier mit PS 7.4 korrekt ein?

Vielen Dank.
Crusher79
Lösung Crusher79 10.05.2024 um 11:31:03 Uhr
Goto Top
Gelöst:

    } -ThrottleLimit 6 -AsJob 

$acro_job | Wait-Job

Wollte die Jobs eh auswerten. In VScode stellte es ich als kein Problem bei jedem Durchlauf da. Aber beim Aufruf via pwsh. Hatte eig. gedacht dass das Limit automatisch einen Stop impliziert. Komisch auch, dass immer nur der 1. Eintrag zum Opfer fiel. Ka wie die Paramater hier konkret gebunden werden.

So ist es aber lauffähig.