gabebu
Goto Top

Powershell : Linie für Linie in ein CSV

Hallo Zusammen

Eine Kurze frage:

Ich habe mehrere Varaiblen und möchte die gerne in nur eine einzige CSV-Datei packen. Mit Export-CSV geht das natürlich nicht , da bei export-csv immer die komplette Datei überschrieben wird und ich habe dazu leider noch nichts gefunden. Also das beispiel wäre so etwas wie:

$variable1 = 1  | export-csv $csv[1]  (Zeile 1)
$variable2= 2   | export-csv $csv[2]  (Zeile 2)
$variable 3 = 3  | export-csv $csv[3]  (Zeile 3)

Wäre so etwas möglich? Der grund ist ,dass ich gerne eine Log-Datei mit allen von mir benötigten Variablen drin damit ich gleich überprüfen kann, was genau in der Variable drin ist.

Besten Dank für eure Antworten.

Content-ID: 232943

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

Ausgedruckt am: 26.11.2024 um 08:11 Uhr

colinardo
colinardo 18.03.2014 aktualisiert um 17:54:26 Uhr
Goto Top
Hallo gabeBU,
no Problem:
$var1 = 1; $var2 = 2; $var3 = 3
$m = @()
$m += New-Object PSObject -Property @{Name = "Var1"; Wert = $var1}  
$m += New-Object PSObject -Property @{Name = "Var2"; Wert = $var2}  
$m += New-Object PSObject -Property @{Name = "Var3"; Wert = $var3}  
$m  | select Name,Wert | export-csv -Path "C:\test.csv" -NoTypeInformation -Delimiter ";"  
Wenn die Variablen eine ähnliche Benennung haben also $var1, $var2, usw. (also sich nur die Zahlen ändern und der erste Teil gleich bleibt) lässt sich das auch noch etwas abkürzen:
$var1 = 1; $var2 = 2; $var3 = 3
$m = @()
get-variable | ?{$_.Name -like "var*"} | %{$m += New-Object PSObject -Property @{Name=$_.Name;Wert=$_.Value}}  
$m | select Name,Wert | export-csv -Path "C:\test.csv" -NoTypeInformation -Delimiter ";"  
Der Trick besteht immer darin aus jeder Zeile die später in der CSV-Datei erscheinen soll, ein Powershell-Objekt zu generieren das seinerseits eine Hashtable mit den Spaltennamen und Werten enthält. Diese Objekte fügen wir dann an ein Array an, welches zum Schluss an export-csv übergeben wird. Das zwischengeschaltete select stellt sicher das die Reihenfolge der Spalten in der CSV-Datei wieder stimmt.

Falls es dich interessiert, ich habe dazu auch mal eine Anleitung geschrieben wie man solche Werte in einer XML-Datei speichern, und auch wieder auslesen kann:
Powershell: Werte aus einer XML-Datei auslesen und wieder darin speichern

Grüße Uwe
Arospace123
Arospace123 18.03.2014 um 16:26:48 Uhr
Goto Top
Ein Profi vor dem Herren wenn's um's Scripting geht. Echt klasse colinardo !!!
gabeBU
gabeBU 18.03.2014 um 18:03:14 Uhr
Goto Top
Danke viel mals!! AUf das kam ich echt nicht...ich habe davon gelesen, aber nicht in dieser Art und Weise...

noch eine kurze Frage:

Ich habe in der Active Directory die Kennwortkomplexität ausgeschaltet, da ich für die Benutzererfassung von MAC-Adressen als Nutzername sowie auch als Passwort die MAC-Adresse benötige

(siehe falls es dich intressiert)
http://h10032.www1.hp.com/ctg/Manual/c02628207.pdf

Nun kann ich auch die MAC-Adresse als Passwort eingeben in der Benutzeroberfläche (Also im Active Directory Benutzer und Computer) aber in der Powershell-Konsole auch mit Administratorenrechten ist es nicht möglich. Muss ich da noch etwas in der Konsole selbst angeben?

Danke für den zweiten Tipp^^

Gruss

gabeBU
colinardo
colinardo 18.03.2014 aktualisiert um 18:11:12 Uhr
Goto Top
Zitat von @gabeBU:
Computer) aber in der Powershell-Konsole auch mit Administratorenrechten ist es nicht möglich. Muss ich da noch etwas in der Konsole selbst angeben?
wie machst du es denn auf der Konsole, und was gibt die Konsole für einen Fehler aus?
so sollte es problemlos gehen:
Set-ADAccountPassword -Identity mmustermann -Reset -NewPassword (ConvertTo-SecureString -AsPlainText "p@ssw0rd" -Force)
schon mal den DC neu gestartet ?
gabeBU
gabeBU 18.03.2014 aktualisiert um 18:23:30 Uhr
Goto Top
Ja diesen Befehl gebe ich fast so ein, also Testweise habe ich es so gemacht

 
Set-ADAccountPassword -Identity 00AA00AA00 (mac-Adresse) -Reset -NewPassword (ConvertTo-SecureString -AsPlainText " 00AA00AA00 (mac-Adresse)" -Force)  

Dann kam die Komplexitäts-Meldung. Im SCript habe ich es dann so vor also ich importiere die CSV:

$Import = import-csv C:\csv.csv

Da habe ich dann eine csvde-taugliche Datei (das Hinzufügen von Benutzern klappt wunderbar)

Zaehle die Reihen (Anzahl Nutzer)
$Reihenzaehler = import-csv C:\csv.csv | Measure-Object;

Mache einen Zaehler fuer eine Schleife

$Zaehler = 0;
dann definiere ich den Benutzernamen
$Benutzername = $Import[$Zaehler].sAMAccountName

und schlussendlich mache ich die Passworteingabe
do
{ 
  Set-ADAccountPassword -Identity $Benutzername -Reset -NewPassword (ConvertTo-SecureString -AsPlainText $Benutzername) -Force
  $Zaehler = $Zaehler + 1
}while ($Zaehler -ne $Reihenzaehler.Count)

Und dann hagelt es eben diese Komplexitäts-Fehlermeldungen...

Ich glaube nicht daran, dass es am DC liegt, da dieser wunderbar funktioniert und ich alle anderen Arbeiten (auch Anmelden, Benutzer verwalten, Kennwörter zurücksetzen) auch erledigen konnte und ich an einer älteren DC (2008, jetzt habe ich 2012) es auch so funktionierte. Aber ich werde ihn mal neustarten.
colinardo
colinardo 18.03.2014 aktualisiert um 18:30:13 Uhr
Goto Top
Zitat von @gabeBU:
Set-ADAccountPassword -Identity $Benutzername -Reset -NewPassword (ConvertTo-SecureString -AsPlainText $Benutzername) -Force
hier ist das -Force an der falschen Stelle muss in die Klammer ...
Und dann hagelt es eben diese Komplexitäts-Fehlermeldungen...
Ich glaube nicht daran, dass es am DC liegt, da dieser wunderbar funktioniert und ich alle anderen Arbeiten
du glaubst aber nur... du ersparst dir und uns weiteren Frust wenn du dich abmeldest und die Kiste neu startest, dann wird es gehen... hatte ich schon öfter.
gabeBU
gabeBU 18.03.2014 um 18:44:16 Uhr
Goto Top
Jetzt gerade gemacht immer noch die gleiche Meldung, das Passwort kann ich immer noch zurücksetzen im Menü...

vielleicht ist das noch irgendeine Sperre bei Powershell selbst, keine Ahnung, zumindest geht es immer noch nicht...auch mit gpupdate keine Chance.
colinardo
colinardo 18.03.2014 um 18:47:24 Uhr
Goto Top
hier geht es einwandfrei... ich kenne eure Struktur nicht, wieviel DCs.. wo werden die Befehle ausgeführt etc.... mach dafür bitte einen neuen Thread auf, das gehört hier nicht rein. Merci.

Grüße Uwe
gabeBU
gabeBU 18.03.2014 um 18:54:08 Uhr
Goto Top
Alles klar, schon gemacht hier der Link: Powershell: Passwort ohne Komplexität funktioniert nicht!
gabeBU
gabeBU 19.03.2014 um 16:26:36 Uhr
Goto Top
Wenn ich gleich nochmals etwas hinterherfragen darf:

geht dieser Export auch so?

csvde -i -k -f \\IPASRV01\transfer\macadresslist.csv -j C:\
$importcsvde = import-csv C:\csv.log

$m = @()
$m += New-Object PSObject -Property @{Name = "Neue User"; Wert = $importcsvde}  
$m  | select Name,Wert | export-csv -Path "C:\test.csv" -NoTypeInformation -Delimiter ";"  

Das müsste doch eigentlich klappen, oder nicht? Denn ich kriege einfach nur leerschläge...
colinardo
colinardo 19.03.2014 aktualisiert um 16:42:50 Uhr
Goto Top
Zitat von @gabeBU:
Das müsste doch eigentlich klappen, oder nicht? Denn ich kriege einfach nur leerschläge...
nie und nimmer ...
was hast du denn vor ? Was steht in der Ausgabe der LOG-Datei genau, ist das überhaupt eine CSV-Datei ??. Möchtest du die Zeile die in der CSV von csvde steht an eine andere dran hängen ? Das geht so:
csvde -i -k -f \\IPASRV01\transfer\macadresslist.csv -j C:\
$importcsvde = import-csv C:\csv.log
$m = @()
$m += $importcsvde
$m | export-csv -Path "C:\test.csv" -NoTypeInformation -Delimiter ";"  
Fragen über Fragen ....
gabeBU
gabeBU 19.03.2014 um 16:43:28 Uhr
Goto Top
Die CSV-Ausgabe listet die Nutzer auf, die gerade per CSVDE ausgegeben wurden. Diese möchte ich zusätzlich zu den anderen Variabeln (die du mir gezeigt hast) in diese Log-Dateie einfügen. Ich werde das hier mal versuchen.
colinardo
colinardo 19.03.2014 aktualisiert um 16:53:41 Uhr
Goto Top
dann musst du die CSV in einer Schleife durchlaufen und nur die Spalte extrahieren die interessant ist. Den Namen der Spalte musst du bei $line.Name (Zeile 5)anpassen, wenn die also Username lautet hieße es $line.Username
csvde -i -k -f \\IPASRV01\transfer\macadresslist.csv -j C:\
$importcsvde = import-csv C:\csv.log
$m = @()
foreach($line in $importcsvde){
    $m += New-Object PSObject -Property @{Name="Neue User";Wert=$line.Name}  
}
$m  | select Name,Wert | export-csv -Path "C:\test.csv" -NoTypeInformation -Delimiter ";"  
gabeBU
gabeBU 19.03.2014 aktualisiert um 17:03:10 Uhr
Goto Top
Super, dann kann ich es vergessen, weil die gebrauchte Spalte fängt mit einem #-Zeichen an und das bedeutet bei Powershell auskommentieren...

Aber vielen dank für den Lösungsvorschlag.
colinardo
colinardo 19.03.2014 aktualisiert um 17:07:21 Uhr
Goto Top
Zitat von @gabeBU:

Super, dann kann ich es vergessen, weil die gebrauchte Spalte fängt mit einem #-Zeichen an
wieso, nö das geht so:
$line.'#Spaltenname'
geht nicht gibt's fast nicht ...
Wird mal Zeit für ... http://www.powershellpraxis.de/ face-wink
gabeBU
gabeBU 19.03.2014 aktualisiert um 17:18:00 Uhr
Goto Top
Ja, ich habe bis jetzt nur selten Powershell wirklich gebraucht...^^ danke für die Tipps.

Dann nur noch ein letzter: Und wenn die Spaltenüberschrift dazu noch leerschläge hat? (Es wird immer noch nicht geschluckt...)


Edit: Hat sich erledigt...die Datei hat gar keine Spaltenüberschriften, einfach mit $line funktionierts.