Unterschied zwischen $ Var ++ und $ Var = $ Var + [int] 1

Ich habe eine etwas eigenartige Angewohnheit von Powershell kennengelernt und würde gerne verstehen, wie das passiert.

    $CurrentADgroups = (Get-ADGroup -filter * -properties GroupCategory -server $ADSERVER).name
    $Row = [int] 1
    $CurrentADgroups | Foreach {$Sheet2.Cells.Item($Row,1) = $_; $Row++}


Foreach : Exception setting "Item": "Exception from HRESULT: 0x800AC472"
At C:\Script\SCRIPT-2.0.ps1:229 char:28
+         $CurrentADgroups | Foreach {$Sheet2.Cells.Item($Row,1) = $_; $Row++}
+                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : NotSpecified: (:) [ForEach-Object], SetValueInvocationException
+ FullyQualifiedErrorId : CatchFromBaseAdapterParameterizedPropertySetValueTI,Microsoft.PowerShell.Commands.ForEachObjectCommand

Das funktioniert!:

    $CurrentADgroups = (Get-ADGroup -filter * -properties GroupCategory -server $ADSERVER).name
    $Row = [int] 1
    $CurrentADgroups | Foreach {$Sheet2.Cells.Item($Row,1) = $_; $Row = $Row + [int]1}

Ist es eine Frage der Zeit? Denn in meinen Augen machen $ Row ++ und $ Row = $ Row + [int] 1 genau dasselbe. Sie zählen eins nach dem anderen aufwärts.

Danke im Voraus!

EDIT1: Ich habe absolut nichts geändert ausser der $ Row zwischen den Tests - besonders mit dem AD und dem Excelsheet.

0
Kann keine anderen Werte sehen.
hinzugefügt der Autor XXInvidiaXX, Quelle
Ich kenne Powershell nicht, aber der einzige Unterschied, den ich in "traditionellem" Verhalten sehe, ist, dass x ++ und x = x + 1 unterschiedliche Werte zurückgeben (ersterer liefert den Wert als es war vor der Inkrementierung, die letztere gibt den neuen Wert zurück).
hinzugefügt der Autor Medinoc, Quelle

1 Antworten

Tests

Ich habe mit diesem Code getestet:

foreach ($n in (1..10)) {

    write-host $var
    write-host $var2
    $var++
    $var2 = $var2 + [int]1
    write-host $var
    write-host $var2

    write-host ("-" * 40)
}

und wenn Sie es ausführen, können Sie sehen, dass es absolut keinen Unterschied im Verhalten gibt.

Sie können auch $ var.GetType() verwenden, um zu sehen, dass beide tatsächlich Int32 sind.

Ich bin mir nicht sicher, ob es eine bessere Möglichkeit gibt, das zu testen ...

Ich würde einfach mit dem gehen, was in der Zwischenzeit funktioniert. Gute Frage.


Vorschlag

Vielleicht könnten Sie Ihren Code auflösen und einige write-host und $ var.gettype() eingeben, um die Variablen in jeder Phase zu testen, so dass Sie sehen können, ob sie da sind sind irgendwelche Unterschiede überhaupt, wenn Sie Ihren Code insbesondere ausführen.

0
hinzugefügt
Ich habe versucht, was du gesagt hast, und es gibt immer genau das gleiche Ergebnis. Mein Vorschlag ist, dass die $ row ++ schneller läuft (und daher mit dem com-Objekt kollabiert?) Als $ row = $ row + [int] 1. Aber ich weiß nicht, wie ich das testen soll.
hinzugefügt der Autor XXInvidiaXX, Quelle