2017-01-08 2 views
1

Ich verstehe, wie man es als Teilausdruck macht, wenn man foreach Schleife verwendet oder Write-Output statt Write-Host. Aber nichts funktioniert. Ich muss Export-Csv den folgenden Ausgang.Ein leeres Rohrelement ist nicht erlaubt

foreach ($i in $a) { 
    Write-Host $i (Get-Mailbox -Database $i -ResultSize Unlimited).Count 
} | Export-Csv "c\users\...\test.csv" -NoTypeInformation 

Oder

$a | ForEach-Object { 
    Write-Host $_ (Get-Mailbox -Database $_ -ResultSize Unlimited).Count 
} | Export-Csv "c\users\...\test.csv" -NoTypeInformation 
+0

warum verwenden Sie 'write-host'? – 4c74356b41

+0

mein Ziel ist es, sowohl die Datenbanknamen und Zählungen in einer Zeile für jede der Daten in $ a zu bringen. DB02 19 DB03 40 DB04 20 mein ganzes Ziel dieser Ausgabe ist zu bringen und auf der Grundlage der Zählung sortieren und dann die erste $ Nummer wählen, die 10 oder 20 sein kann, usw. – iamsmith41

+0

Das Rohr leer ist, weil du bist nichts an die Pipe ausgeben. 'Write-Host' sendet es direkt an die Konsole und ignoriert die Pipe. Können Sie ein Beispiel dafür nennen, was Sie in der CSV-Datei erwarten? –

Antwort

4

Sie sehen den Fehler "Eine leere Pipe ist nicht erlaubt", weil die foreach ($x in $y) Anweisung keine Pipeline ausgibt. Wenn Sie die Pipeline-Ausgabe verwenden müssen, verwenden Sie stattdessen die Cmdlet-Version $y | Foreach-Object.

Das zweite Problem ist, dass Ihr Code nichts an die Pipe ausgibt. Write-Host sendet die Ausgabe direkt an die Konsole und ignoriert die Pipe. Verwenden Sie für die Ausgabe in die Pipeline Write-Output, oder verwenden Sie das Objekt einfach als Anweisung und PowerShell ruft implizit Write-Output auf.

Es ist nicht klar, was Sie in der CSV-Datei erwarten, aber der folgende Code verwendet PSCustomObject, um eine CSV mit zwei Spalten auszugeben. Der erste ist ein Element von $a und der zweite ist die Zählung Ihres get-mailbox Anrufs. Beachten Sie, dass dies zur besseren Lesbarkeit auf mehrere Zeilen aufgeteilt ist.

$a | foreach-object { 
    [PSCustomObject]@{ 
    first=$_ 
    second=(get-mailbox -database $_ -resultsize unlimited).count 
    } 
} | export-csv "c\users\...\test.csv" -notypeinformation 
+1

* Ein leeres Pipe-Element ist nicht erlaubt. * Ist der Syntaxfehler. Es passiert, weil es überhaupt keinen Befehl gibt ('<# kein Befehl hier #> | Befehl'). Ein Pipeline-Befehl, der nichts an die Pipeline ausgibt, verletzt überhaupt keine PowerShell-Regeln ('Write-Host Message | Command'). – PetSerAl

+0

Hier mit @PetSerAl einverstanden zu sein, ist diese Antwort irreführend (obwohl die vorgeschlagene Lösung perfekt ist) –

+0

Vielen Dank für die Korrektur. Ich habe die Erklärung aktualisiert. Ich habe eindeutig in den frühen Morgenstunden nicht nachgedacht. –

0

Verwenden Write-Output statt Write-Host. Write-Host sendet die Ausgabe direkt an die Konsole und nicht an die Pipe. Write-Ouput ist für die Verwendung in Rohrleitungen ausgelegt.

Hoffe, dass hilft.

+1

Die Verwendung von 'Write-Output' ist unnötig. Jede Anweisung, die einen Wert ausgibt, wird implizit an "Write-Output" gesendet. Die folgenden beiden Anweisungen sind identisch: 'Write-Output 'Hallo'' und '" Hallo "' –

Verwandte Themen