mrcount
Goto Top

Fehlende Ausgabe im 1. Durchlauf

Servus zusammen,

ich habe folgendes (Teil-)Script (Powershell):

Connect-ExchangeOnline

$menu = "y"  
while($menu -eq "y" -or $menu -eq "Y")  
{
    $tmp_arr = Get-MigrationUser -ResultSize Unlimited | select Identity, BatchId, Status, *ItemCount, DataConsistencyScore
    $res = $tmp_arr | ft Identity, BatchId, Status, *ItemCount, DataConsistencyScore | Out-String
    $res = $res.Trim()

    $i=1
    $z=1
    foreach($data in $($res -split "`r`n"))  
    {
    
        if($z -gt 2)
        {
            if($i -lt 10)
            {
                Write-Host " $i) $data"  
            }
            else
            {
                Write-Host "$i) $data"  
            }
            $i = $i+1
        }
        else
        {
            Write-Host "`t$data"  
            $z = $z + 1
        }
    }

    Write-Host " "  
    Write-Host " 0) END"  

    do
    {
        $max_i = $i-1
        $input = Read-Host "Select entry (1 - $max_i)"  
        $input_value = $input -as [int]
    }while($input_value -lt 0 -or $input_value -gt $max_i)

    if($input_value -eq 0)
    {
        Write-Host "END"  
    }
    else
    {
        $num = $input_value-1
        $tmp_arr[$num].Identity
        Get-MoveRequest -Identity $tmp_arr[$num].Identity | Get-MoveRequestStatistics
    }

    Write-Host " "  
    $menu = Read-Host "start over? (y/n)"  
}

Beim ersten Durchlauf erhalte ich bei Zeile 52
Get-MoveRequest -Identity $tmp_arr[$num].Identity | Get-MoveRequestStatistics
eine leere Ausgabe (rote Markierung im Screenshot), dafür aber beim zweiten Durchlauf das Ergebnis des ersten und des aktuellen Durchlaufs (gelbe Markierung im Screenshot).
Danach läuft alles, wie es soll...
Auch ein doppeltes Ausführen der Zeile 52 oder ein Start-Sleep hat nichts gebracht.

Kann mir jemand sagen, woran das liegen kann?

Hier mal die Ein-/Ausgabe als Screenshot:
ps-out

Content-ID: 2841380763

Url: https://administrator.de/contentid/2841380763

Ausgedruckt am: 22.11.2024 um 05:11 Uhr

MrCount
Lösung MrCount 19.05.2022 um 16:25:57 Uhr
Goto Top
Ich habe eine (oder DIE) Lösung gefunden:

Ergänze ich Zeile 52 mit
| ft

also zu
Get-MoveRequest -Identity $tmp_arr[$num].Identity | Get-MoveRequestStatistics | ft

klappt es auch im ersten Durchgang.
colinardo
colinardo 19.05.2022 aktualisiert um 16:47:36 Uhr
Goto Top
Ja, bei manchen CMDLets muss man manchmal sagen wie sie etwas ausgeben soll, sonst bleibt das manchmal im Puffer hängen face-smile.
$input -as [int]
Achtung für die Zukunft: Special Variable Names
$INPUT Represents an enumerator that enumerates all input that is passed to a function.

Grüße Uwe
TK1987
TK1987 19.05.2022 aktualisiert um 16:46:25 Uhr
Goto Top
Moin,

Zitat von @MrCount:
while($menu -eq "y" -or $menu -eq "Y")  
ist doppelt gemoppelt. Powershell ist per default case insensitive. Daher: "y" ist das gleiche wie "Y".

Möchte man explizit Groß- und Kleinschreibung berücksichtigt haben, so muss man -ceq statt -eq verwenden.

Darüber hinaus sind Befehle wie format-table und out-string eigentlich nur für die Ausgabe gedacht. Du solltest dir besser angewöhnen, die Powershell-Objekte zu verarbeiten, statt diese in Zeichenketten umzuwandeln.

Gruß Thomas
MrCount
MrCount 19.05.2022 um 16:51:37 Uhr
Goto Top
Danke für die Hinweise!!
colinardo
Lösung colinardo 19.05.2022 aktualisiert um 17:30:48 Uhr
Goto Top
Solche Menüs kann man sich in der Regel ersparen und die Auswahl mit Out-GridView und -Passthru abfackeln:
Get-MigrationUser -ResultSize Unlimited | select Identity, BatchId, Status, *ItemCount, DataConsistencyScore | Out-GridView -PassThru -Title "Bitte wählen sie den/die User" | Get-MoveRequest | Get-MoveRequestStatistics | ft