PowerShell-Methode ".count" verursacht fehlerhafte Verarbeitung

5084
STGdb

Ich erstelle in PowerShell ein Array, das nicht immer Daten enthält (manchmal ist es leer). Ich muss überprüfen, ob das Array Daten enthält, bevor ich etwas mit den Array-Objekten anfangen kann. Wenn ich den folgenden Code verwende, funktioniert alles wie erwartet:

$Array = @(“This”,”is”,”a”,”test”) $Array | ForEach-Object { If ($Array.Count -ge 1) { [string]$A = $_ Write-Host $A } } 

Mit dem obigen Code erhalte ich folgende Ausgabe:

This is a test 

Das obige überprüft die .Count des Arrays jedes Mal, wenn ein Objekt im Array verarbeitet wird (es kann also je nach Anzahl der Objekte im Array die Anzahl der Arrays tausend oder mehr geprüft werden ). Ich möchte die Anzahl der Arrays nur einmal überprüfen, bevor die Array-Objekte verarbeitet werden. Der folgende Code liefert jedoch nicht die richtige Ausgabe:

$Array = @(“This”,”is”,”a”,”test”) If ($Array.Count -ge 1) { $Array | ForEach-Object { { [string]$A = $_ Write-Host $A } } } 

Ich erhalte die folgende Ausgabe, wenn ich den obigen Code ausführe:

 [string]$A = $_ Write-Host $A  [string]$A = $_ Write-Host $A  [string]$A = $_ Write-Host $A  [string]$A = $_ Write-Host $A 

Dabei spielt es keine Write-Host den Wertes des $ A Variable wie der vorherige Code tat, sondern druckt er den tatsächlichen Powershell - Code selbst aus. Alles, was ich getan habe, war die .Count- Prüfung so zu verschieben, dass sie die Anzahl vor dem Beginn der Verarbeitung von Objekten im Array überprüft. Warum erhalte ich die obige Ausgabe, wenn ich die Array-Zählung vor der ForEach-Object- Anweisung verschiebe? Muss ich die Array-Anzahl jedes Mal überprüfen, wenn ich ein Objekt aus dem Array verarbeite?

Vielen Dank

0

1 Antwort auf die Frage

4
shinjijai

Ich vermute, warum Powershell dies für Ihr zweites Beispiel druckt

[string]$A = $_ Write-Host $A  [string]$A = $_ Write-Host $A 

liegt daran, dass Powershell die doppelte Klammer {{}}als String-Literal verwendet.

Um dies zu erreichen, sollten Sie das testen, $Arraybevor Sie die for-Schleife ausführen.

So sollte der Code aussehen:

$Array = @(“This”,”is”,”a”,”test”) if($Array.Count -ge 1){ foreach($A in $Array){ Write-Host $A } } 

Und als One-Liner (ish)

$Array = @(“This”,”is”,”a”,”test”)  if($Array.Count -ge 1){ $Array| %} 
Entschuldigung, ich würde Ihren Namen eingeben, aber ich habe Fehler, wenn Sie meine Kommentare hier eingeben. Ich sage nur Kudos. Ich habe keine Ahnung, warum ich doppelte geschweifte Klammern verwendet habe. Ich denke, Formatierungsgewohnheiten. Ich kann nicht glauben, dass ich das nicht gesehen habe ... Es funktioniert jetzt ... Danke !!! STGdb vor 10 Jahren 0
Die Sache in den geschweiften Klammern ist ein Skriptblock. dangph vor 10 Jahren 0