TierOne Geschrieben 19. Juni 2014 Teilen Geschrieben 19. Juni 2014 Hey ho Community , Über mich: Ausbildungsjahr FiSiIch bin gerade dabei mir etwas Powershell beizubringen.Mittlerweile bin ich in der Lage, einige Standard Befehle über die PS-Konsole auszuführen. Aufgabe: (Ich habe für meine Aufgabe kein Limit bekommen.) Es geht darum, dass unser FTP Server von WS03 auf WS12r2 umgebaut wird. Nun müssen die Sachen verschoben werden und geklärt werden, ob externe Firmen und interne Kollegen überhaupt noch damit arbeiten und sie darauf hinweisen, dass das ganze verschoben wird. (Ich glaube man nennt es migrieren richtig?). Ich könnte jetzt einfach den Explorer öffnen und in das entsprechende Verzeichnis gehen. Mir die letzten Aktivitäten bis zum 01.01.2014 raussuchen und rausschreiben. (Habe ich schon gemacht, bis ich auf die Idee mit PS kam ) Ziel: Ausgabe der gewünschten Informationen über Excel Weg bis jetzt: Schritt 1 Zu erst einmal habe ich versucht die Daten auszulesen. Dazu musste ich erstmal schauen, welchen cmdlet ich benötige. Für mich kam dann auch der dir /Get-ChildItem in frage. Ungünstiger weise gab dieser mir teilweise nicht die benötigten Informationen aus . Nach langem Überlegen und Google zu dem cmd Get-ChildItem bin ich auf folgendes Ergebnis gekommen für meinen Zweck: [COLOR="#0000FF"]Get[/COLOR]-[COLOR="#008000"]Childitem[/COLOR] -[COLOR="#FF0000"]Recurse[/COLOR] | [COLOR="#FF0000"]Select-Object [/COLOR][COLOR="#FF8C00"]Owner, Name, Fullname, Attributes, LastWriteTime [/COLOR]| [COLOR="#FF0000"]Sort-Object [/COLOR][COLOR="#FF8C00"]LastWriteTime[/COLOR] | [COLOR="#FF0000"]Out-GridView[/COLOR] Schritt 2 Ausgabe in eine Excel Tabelle. Ich habe dazu diese Anleitung gefunden ( für einen anderen cmdlet) Versucht es zu verstehen und umzuschreiben. Tutorial $processes = Get-WmiObject -class Win32_Process $excel = new-object -comobject excel.application $excel.visible = $true $workbook = $excel.workbooks.add() $workbook.workSheets.item(3).delete() $workbook.WorkSheets.item(2).delete() $workbook.WorkSheets.item(1).Name = "Processes" $sheet = $workbook.WorkSheets.Item("Processes") $x = 2 $lineStyle = "microsoft.office.interop.excel.xlLineStyle" -as [type] $colorIndex = "microsoft.office.interop.excel.xlColorIndex" -as [type] $borderWeight = "microsoft.office.interop.excel.xlBorderWeight" -as [type] $chartType = "microsoft.office.interop.excel.xlChartType" -as [type] For($b = 1 ; $b -le 2 ; $b++) { $sheet.cells.item(1,$.font.bold = $true $sheet.cells.item(1,$.borders.LineStyle = $lineStyle::xlDashDot $sheet.cells.item(1,$.borders.ColorIndex = $colorIndex::xlColorIndexAutomatic $sheet.cells.item(1,$.borders.weight = $borderWeight::xlMedium } $sheet.cells.item(1,1) = "Name of Process" $sheet.cells.item(1,2) = "Working Set Size" Foreach($process in $processes) { $sheet.cells.item($x, 1) = $process.name $sheet.cells.item($x,2) = $process.workingSetSize $x++ } $range = $sheet.usedRange $range.EntireColumn.AutoFit() | out-null $workbook.charts.add() | out-null $workbook.ActiveChart.chartType = $chartType::xl3DPieExploded $workbook.ActiveChart.SetSourceData($range) For($i = 1 ; $i -le 360 ; $i +=15) { $workbook.ActiveChart.rotation = $i } IF(Test-Path $strPath) { Remove-Item $strPath $Excel.ActiveWorkbook.SaveAs($strPath) } ELSE { $Excel.ActiveWorkbook.SaveAs($strPath) }[/code] Es hat leider nicht geklappt, dass ganze übersteigt auch meine bisherigen Kenntnis, einige Teile erinnern mich an den C# Unterricht in der Schule [code] chdir D:\ $ausgabe = Get-Childitem -Recurse | Select-Object Owner, Name, Fullname, Attributes, LastWriteTime | Sort-Object LastWriteTime $excel = new-object -comobject excel.application $excel.visible = $true $workbook = $excel.workbooks.add() $workbook.workSheets.item(3).delete() $workbook.WorkSheets.item(2).delete() $workbook.WorkSheets.item(1).Name = "FTP" $sheet = $workbook.WorkSheets.Item("FTP") $x = 2 $lineStyle = "microsoft.office.interop.excel.xlLineStyle" -as [type] $colorIndex = "microsoft.office.interop.excel.xlColorIndex" -as [type] $borderWeight = "microsoft.office.interop.excel.xlBorderWeight" -as [type] $chartType = "microsoft.office.interop.excel.xlChartType" -as [type] For($b = 1 ; $b -le 2 ; $b++) { $sheet.cells.item(1,$.font.bold = $true $sheet.cells.item(1,$.borders.LineStyle = $lineStyle::xlDashDot $sheet.cells.item(1,$.borders.ColorIndex = $colorIndex::xlColorIndexAutomatic $sheet.cells.item(1,$.borders.weight = $borderWeight::xlMedium } $sheet.cells.item(1,1) = "Name of Owner" $sheet.cells.item(1,2) = "Name of data" $sheet.cells.item(1,3) = "Fullname (Path)" $sheet.cells.item(1,4) = "Attributes" $sheet.cells.item(1,5) = "LastWriteTime" Foreach($ausgabe in $FTP) { $sheet.cells.item($x,1) = $ausgabe.owner $sheet.cells.item($x,2) = $ausgabe.Name $sheet.cells.item($x,3) = $ausgabe.Fullname $sheet.cells.item($x,4) = $ausgabe.Attributes $sheet.cells.item($x,5) = $ausgabe.LastWriteTime $x++ } $range = $sheet.usedRange $range.EntireColumn.AutoFit() | out-null Könnte mir jemand dabei helfen, dass so umzuschreiben, dass es für mich passend ist und ich es demnächst selbst ohne Probleme bewerkstelligen kann Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Blueshark Geschrieben 20. Juni 2014 Teilen Geschrieben 20. Juni 2014 chdir x:\ $ausgabe = Get-Childitem -Recurse | Select-Object Owner, Name, Fullname, Attributes, LastWriteTime | Sort-Object LastWriteTime $excel = new-object -comobject excel.application $excel.visible = $true $workbook = $excel.workbooks.add() $workbook.workSheets.item(3).delete() $workbook.WorkSheets.item(2).delete() $workbook.WorkSheets.item(1).Name = "FTP" $sheet = $workbook.WorkSheets.Item("FTP") $x = 2 $lineStyle = "microsoft.office.interop.excel.xlLineStyle" -as [type] $colorIndex = "microsoft.office.interop.excel.xlColorIndex" -as [type] $borderWeight = "microsoft.office.interop.excel.xlBorderWeight" -as [type] $chartType = "microsoft.office.interop.excel.xlChartType" -as [type] For($b = 1 ; $b -le 2 ; $b++) { $sheet.cells.item(1,$.font.bold = $true $sheet.cells.item(1,$.borders.LineStyle = $lineStyle::xlDashDot $sheet.cells.item(1,$.borders.ColorIndex = $colorIndex::xlColorIndexAutomatic $sheet.cells.item(1,$.borders.weight = $borderWeight::xlMedium } $sheet.cells.item(1,1) = "Name of Owner" $sheet.cells.item(1,2) = "Name of data" $sheet.cells.item(1,3) = "Fullname (Path)" $sheet.cells.item(1,4) = "Attributes" $sheet.cells.item(1,5) = "LastWriteTime" Foreach($ausgabe_ausgeben in $ausgabe) { $sheet.cells.item($x,1) = $ausgabe_ausgeben.owner $sheet.cells.item($x,2) = $ausgabe_ausgeben.Name $sheet.cells.item($x,3) = $ausgabe_ausgeben.Fullname $sheet.cells.item($x,4) = $ausgabe_ausgeben.Attributes $sheet.cells.item($x,5) = $ausgabe_ausgeben.LastWriteTime $x++ } $range = $sheet.usedRange $range.EntireColumn.AutoFit() | out-null[/code] Hab mal drüber geschaut Die Foreach war nicht ganz korrekt - kannst die Variabel $ausgabe_ausgeben natürlich verändern ^^ Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Blueshark Geschrieben 20. Juni 2014 Teilen Geschrieben 20. Juni 2014 ach und ich habe zum Testen den Laufwerksbuchstaben oben in X: verändert. Das bitte auch beachten. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TierOne Geschrieben 24. Juni 2014 Autor Teilen Geschrieben 24. Juni 2014 Aaachso vielen dank D.h. mit der Variable "FTP" bennene ich wirklich nur die Mappe in excel um. Ich dachte aber immer, dass das Enum $ausgabe_ausgeben auf die Variable $ausgabe zugreift oder lese ich das gerade nur falsch? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Tiro Geschrieben 24. Juni 2014 Teilen Geschrieben 24. Juni 2014 Wäre ein Export-CSV nicht einfacher? ;-) Get-Childitem -Recurse | Select-Object Owner, Name, Fullname, Attributes, LastWriteTime | Export-Csv -path D:\temp\hiereinname.csv -NoTypeInformation -Encoding UTF8 Und "Owner" ist keine Eigenschaft von Get-Childitem. Das sollte also stets leer sein? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TierOne Geschrieben 24. Juni 2014 Autor Teilen Geschrieben 24. Juni 2014 Das mit dem "Owner" ist mir eben auch aufgefallen beim rum probieren. Gibt es eine Variable, welche mir anziegen lassen kann, wer zuletzt die entsprechende Datei bearbetiet hat? Im Windows Explorer ist es tatsächlich die Registerspalte "Owner" ( auf englisch) ich habe es schon versucht mit dem befehlen probiert aber ich bin nicht schlüssig geworden: get-help select-object Die CSV Aktion ist auch eine coole sache aber nicht so schön struktiriert wie mein oberer Teil. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
SilentDemise Geschrieben 24. Juni 2014 Teilen Geschrieben 24. Juni 2014 muss es denn wirklich excel sein? wäre csv nicht viel passender? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TierOne Geschrieben 24. Juni 2014 Autor Teilen Geschrieben 24. Juni 2014 Nein das ist nicht zwingend notwendig. Eine CSV datei kann mit jedem gängigen editor geöffnet werden, jedoch keine formatierungen annehmen richtig? während ich tatsächlich mit der ausgabe in eine Excel datei die sachen strukturieren kann. Wobei das mit dem Formatieren keine Rolle spielen würde, sofern ich meine Abfrage so hinbekomme, dass ich wirklich nur gewollte informationen erhalte. Get-Childitem -Recurse | Select-Object Owner, Name, Fullname, Attributes, LastWriteTime | Sort-Object LastWriteTime so müsste ich den "Owner" ( den letzten bearbeiter der Datei/orders) bekommen attributes mit dem parameter '16' bzw. 'd----' füttern ( damit nur ordner rauskommen) Dann währe meine Abfrage komplett und ich müsste nicht hochwertige Listen ausgeben lassen um spatter die unwichtigen informationen zu löschen. nur leider komme ich bei den beiden Punkten nicht weiter. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Tiro Geschrieben 24. Juni 2014 Teilen Geschrieben 24. Juni 2014 nur leider komme ich bei den beiden Punkten nicht weiter. Für die Anzeige der Ordner mußt Du nur eine Filterung zwischen get-childitem und select-object setzen. ein | where {$_.Mode -match 'd-'} sollte da genügen. Für den Benutzer muß man leider ein gewagtes Konstrukt basteln, welches auch Deine Abfrage so dermaßen verlangsamt, daß Du selbst wissen mußt, ob Du es so laufen lassen möchtest. Ersetze "Owner" durch @{n="Owner";e={(get-acl $_.fullname).owner}} Lasse auch die Sortierung weg. In Excel sortierst Du die csv schneller. ;-) Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
SilentDemise Geschrieben 24. Juni 2014 Teilen Geschrieben 24. Juni 2014 Was fehlt dir denn noch? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TierOne Geschrieben 26. Juni 2014 Autor Teilen Geschrieben 26. Juni 2014 OK vielen vielen dank, es funktioniert jetzt würde ich es nur gerne verstehen können Und ich habe noch etwas probiert um die Ausgabe der Daten zu beschränken, damit ich keine Datensätze aus dem Jahre 1980 become. O.o meine csv. datei war gute 35,5mb groß Nur leider funktioniert das nicht ganz wie ich mir das vorstelle zwischen 2 Zeiträumen zu Sortieren, ich schafe es nicht mal einen auszugeben. Get-Childitem -Recurse | where {$_.Mode -match 'd-'} | [COLOR="#DAA520"]Where-Object {$_.TimeGenerated.Month -eq 06 -and $_.TimeGenerated.Year -eq 2014} | [/COLOR] Select-Object @{n="Owner";e={(get-acl $_.fullname).owner}}, Name, Fullname, Attributes, LastWriteTime | Export-Csv -path D:\test.csv -NoTypeInformation -Encoding UTF8 get-acl > Gibt die Berechtigung Nutzer anzeigen zu lassen? where-Object > ist gleichzusetzen mit dem SQL Where Befehl / Bedingung? $_. > $ ist ja das Vorzeichen einer Variable richtig? _ steht als Plazhalter? . zur verbindung zu einem Parameter? @{n="Owner";e={(get-acl $_.fullname).owner}}, @ist das einleiten einer eigenen Methode? n steht für? e steht für ? bzw. wie ist die Komplete Zeile zu lessen? Ich hoffe, ich frage hier nicht zu viel komisches Zeug Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Tiro Geschrieben 26. Juni 2014 Teilen Geschrieben 26. Juni 2014 Also erstmal genügt eine Filterung mit "where-object" (kurz "where"). Die anderen Bedingungen sind mit "-and" (oder natürlich auch "-or") an die erste anzuhängen. Ich habe es nicht ausprobiert, aber Dein Biespiel funktioniert entweder gar nicht oder es läuft sehr langsam. Woher hast Du die Eigenschaft "timegenerated"? Das ist keine Eigenschaft von Get-ChildItem. CreationTime wäre eine. Also eher sowas where-object {$_.Mode -match 'd-' -and $_.creationtime.Year -match '2014'} (= alle Ordner die 2014 erstellt wurden) get-acl gibt die Berechtigungen aus. (Zitat der Hilfe "Gets the security descriptor for a resource, such as a file or registry key.") "$" verweist auf den reinen Inhalt der Variable. Die Variable kann x mit dem Wert 5 sein. Den Inhalt der Variable fragt man mit $x ab. "$_." ist die Schreibweise/ Syntax für "nehme den Inhalt der Variable aus der Pipeline, verknüpfe ihn mit der angegebenen Eigenschaft nach dem Punkt (hier "Mode") Eher was grundsätzliches: * wenn Du einen Befehl nicht kennst, dann schau in die Hilfe mit "get-help <Befehl> -full" Das muß jeder machen ;-) Sogar Don Jones und Holger Schwichtenberg. Es ist lehrreich und es sind stets Beispiele dabei. * Warum willst Du Dich in PowerShell zu Tode filtern, wenn Du sowieso nach Excel exportierst? Je nach Datenmenge vervielfachst Du die Laufzeit des Skripts. Das "zuviel" an Daten filtere ich doch schneller in Excel mit Pivot. "good practise" ist es, die Daten so unbearbeitet wie möglich zu lassen, wenn es irgendwie geht. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.