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-Key: 2841380763

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

Printed on: May 8, 2024 at 18:05 o'clock

Member: MrCount
Solution MrCount May 19, 2022 at 14:25:57 (UTC)
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.
Member: colinardo
colinardo May 19, 2022 updated at 14:47:36 (UTC)
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
Member: TK1987
TK1987 May 19, 2022 updated at 14:46:25 (UTC)
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
Member: MrCount
MrCount May 19, 2022 at 14:51:37 (UTC)
Goto Top
Danke für die Hinweise!!
Member: colinardo
Solution colinardo May 19, 2022 updated at 15:30:48 (UTC)
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