2016-09-20 3 views
2

Ich habe 3 Variablen. Jede Variable ist ein Array von Benutzern. Ich versuche, eine CSV in PowerShell zu erstellen, die diese drei Arrays in separaten Headern enthält, aber der Code, den ich verwende, funktioniert nicht.Verwenden von Variablen in CSV

Hier ist der Code:

$buildcsv = @" 
1st Notification, 2nd Notification, 3rd Notification 
$1nclient, $2nclient, $3nclient 
"@ 

$excsv = ConvertFrom-Csv $buildcsv 

jedoch der Ausgang gibt mir nur den Header, nicht die entsprechende Liste der Benutzer.

PS> $excsv 

1st Notification 2nd Notification 3rd Notification 
---------------- ---------------- ----------------

Die Ausgabe, die ich erwarten würde wie folgt aussehen:

1st Notification  2nd Notification  3rd Notification 
----------------  ----------------  ---------------- 
hi.microsoft.com  [email protected]  [email protected] 
hello.microsoft.com [email protected] 
        [email protected] 

Gibt es einen Grund, warum eine Variable vom Typ System.Array nicht funktionieren würde?

+1

geben Sie uns ein Beispiel von $ 1nclient, $ 2nclient und $ 3nclient ** und ** die Ausgabe, die Sie erwarten. –

+1

Wurden diese Variablen vor dem Definieren der mehrzeiligen Zeichenfolge ausgefüllt? "$ Input" ist eine [automatische Variable] (https://technet.microsoft.com/en-us/library/hh847768.aspx), die nicht als reguläre Variable verwendet werden sollte. –

+0

@MartinBrandl Die Beispiele aller drei Variablen wären eine unterschiedliche Liste von Computernamen: $ 1nclient = hi.microsoft.com, hello.microsoft.com. --- $ 2nclient = [email protected], [email protected], [email protected] --- $ 3nclient = [email protected] –

Antwort

2

CSV Objekte werden nicht in der Art und Weise gebaut Sie entdeckt wollen in andere Antworten und Kommentare. Normalerweise muss jede Zeile ein eigenes Objekt sein, das die gleichen Eigenschaften wie jede davor hat. Wir machen hier keine echte CSV, sondern eine Sammlung von Listen.

Ich wollte zeigen, dass PowerShell verzeiht mit Array-Notation sowie eine andere Methode, um zu bestimmen, wie viele Zeilen Sie haben.

$1nclient = @("hi.microsoft.com", "hello.microsoft.com") 
$2nclient = @("[email protected]", "[email protected]", "[email protected]") 
$3nclient = @("[email protected]") 

$maximumEntries = ($1nclient,$2nclient,$3nclient | Measure-Object -Property Count -Maximum).Maximum 

0..($maximumEntries - 1) | ForEach-Object{ 
    [pscustomobject][ordered]@{ 
     '1st Notification' = $1nclient[$_] 
     '2nd Notification' = $2nclient[$_] 
     '3rd Notification' = $3nclient[$_] 
    } 
} 

ein nicht vorhandenes Array-Elements in Power Aufruf wird ein Null zurück. Es gibt also wenig Programmierbedarf, um das zu erklären. Sie müssen auch kein Array erstellen. Benutze einfach die Pipeline. Sie können auf Export-CSV am Ende davon, wenn Sie wollten.

Beachten Sie, dass es wichtig ist, Array-Typen mit etwa @() zu garantieren. Andernfalls behandelt PowerShell die Zeichenfolge selbst als Array und gibt einzelne Buchstaben von Positionen in einer Zeichenfolge anstelle des ersten Elements zurück.

+0

dieser Code funktioniert, aber ich bekomme Informationen in der Variable $ objects hinzugefügt. Um mehr zu erklären, bevölkere ich die $ 1nclient-Variablen aus einem importierten CSV-Bericht. Wenn ich also Ihren Code ausführe, erhalte ich tatsächlich @ {[email protected]}, wobei display_client_name der Name der Kopfzeile des importierten CSV ist. - –

+0

Sie müssen die Eigenschaft erweitern. Fügen Sie einfach $ 1nclient [$ _]. Display_client_name hinzu. @justinbeagley – Matt

+0

ah - vielen Dank. –

4

Leider ist dies nicht, wie Powershell funktioniert, da Sie eine Liste der Spalten mit dort Werte anstelle einer Liste von Zeilen (Datensätze) haben. So haben Sie zu transponieren Ihre Spaltenanordnung in eine Sammlung von Zeilen:

$1nclient = @("hi.microsoft.com", "hello.microsoft.com") 
$2nclient = @("[email protected]", "[email protected]", "[email protected]") 
$3nclient = @("[email protected]") 

$biggestArray = [Math]::Max($1nclient.Count, ([Math]::Max($2nclient.Count, $3nclient.Count))) 

$objects = @() 

for ($i = 0; $i -lt $biggestArray; $i++) 
{ 
    if ($1nclient.Count -le $i) { $current1 = '' } else { $current1 = $1nclient[$i]} 
    if ($2nclient.Count -le $i) { $current2 = '' } else { $current2 = $2nclient[$i]} 
    if ($3nclient.Count -le $i) { $current3 = '' } else { $current3 = $3nclient[$i]} 

    $objects += [PsCustomObject]@{ 
     '1st Notification' = $current1 
     '2nd Notification' = $current2 
     '3rd Notification' = $current3 
    } 
} 
$objects 

Ausgang:

1st Notification 2nd Notification  3rd Notification  
---------------- ----------------  ----------------  
hi.microsoft.com [email protected]  [email protected] 
hello.microsoft.com [email protected]       
        [email protected]       
+0

Danke für die Antwort. Aber gibt es keine effizientere Möglichkeit, eine Spalte für die CSV-Datei zu füllen? Was passiert, wenn ich ein Excel.application-Objekt und ein Blatt erstellt habe und eine foreach-Schleife ausgeführt habe, um jede Zelle in einer Spalte zu füllen? –

+0

Auch - dieser Code funktioniert, aber ich bekomme Informationen in der Variable $ objects hinzugefügt. Um mehr zu erklären, bevölkere ich die $ 1nclient-Variablen aus einem importierten CSV-Bericht. Wenn ich also Ihren Code ausführe, erhalte ich tatsächlich @ {di[email protected]}, wobei display_client_name der Name der Kopfzeile des importierten CSV ist. –