Zum Inhalt springen

Powershell script Hilfe | auslesen | Excel


Empfohlene Beiträge

Hey ho Community :),

Über mich:

  • Ausbildungsjahr FiSi
  • Ich 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,$B).font.bold = $true $sheet.cells.item(1,$B).borders.LineStyle = $lineStyle::xlDashDot $sheet.cells.item(1,$B).borders.ColorIndex = $colorIndex::xlColorIndexAutomatic $sheet.cells.item(1,$B).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 :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 ^^

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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. ;-)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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ß :D

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 :)

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...