Jump to content

BOfH_666

Expert Member
  • Gesamte Inhalte

    2.047
  • Registriert seit

  • Letzter Besuch

Alle erstellten Inhalte von BOfH_666

  1. Die unveränderte Ausgabe des Befehls Get-Process sieht aber normalerweise genauso aus, wie das was per Out-File in eine Datei exportiert wird. Versuch mal ... Get-Process -OutVariable Prozesse | Out-File -FilePath "C:\Users\Documents\Test2\Neu.txt" -Encoding ASCII -Width 100 ; $Prozesse Davon unabhängig kann man natürlich die Ausgabe so gestallten, dass die Informationen enthalten sind, die man haben möchte. Für strukturierte Daten bietet sich natürlich CSV oder XML viel eher an als reiner Text.
  2. Das kommt auf Deine Scripting-Erfahrung an und was Du dann danach mit den ausgelesenen Daten anstellen willst. Wenn es zwingend in Excel sein soll, kommt eigentlich nur VBA in Frage. Wenn Du aber bei der "Laufzeitumgebung" flexibel bist, könntest Du auch Powershell nehmen (das würde ich favorisieren, weil ich kein VBA drauf hab ;) ).
  3. Üblicherweise zeigt Get-Hotfix nur die "richtigen" Windows-Updates an. Keine Office-Updates oder für irgendwelche C++ - Runtimes oder so.
  4. Hmmm ... bitte den Code als Code formatieren! Das macht uns und auch Dir das Leben leichter. ;) Ich würde es so anfangen: $inFile = "C:\PowerTest\testinput.csv" $Drunter = "C:\PowerTest\out_File_Drunter.csv" $Drueber = "C:\PowerTest\out_File_Drueber.csv" $Drin = "C:\PowerTest\out_File_Drin.csv" Import-Csv -Delimiter ',' -Encoding Default -Path $inFile | ForEach-Object { If([INT]$_.Long -le 10){ $_ | Export-Csv -Path $Drunter -Delimiter ';' -NoTypeInformation -Append } ElseIf([INT]$_.Long -gt 10 -and [INT]$_.Long -le 20){ $_ | Export-Csv -Path $Drin -Delimiter ';' -NoTypeInformation -Append } Else{ $_ | Export-Csv -Path $Drueber -Delimiter ';' -NoTypeInformation -Append } } ... Du wolltest ja schließlich 3 Bedingungen prüfen. Noch'n generellen Tipp: Unnötige Kommentare kannst Du weglassen. Jeder der Powershell kennt, weiß was Import-CSV macht, oder was eine Variablenzuweisung ist ... usw.
  5. Na zeig doch mal her .... was hast Du denn schon? Du kannst den Code hier (entsprechend als Code formatiert) posten, dann sehen wir bestimmt, wo's klemmt. ;)
  6. Ganz einfach: Du liest die CSV-Datei ein mit Import-CSV, dann vergleichst Du die gewünschten Werte mit Deinen Vorgaben, entweder mit if oder switch und dann benutzt Du Export-CSV, um die entsprechenden Zeilen jeweils in eine eigene Datei zu schreiben. Was hast Du denn schon? bzw. Wo steckst Du fest? Empfehlung: Du solltest Dir die Hilfe der einzelnen cmdlets dringend komplett durchlesen, inclusive der Beispiele und dann ein wenig "rumspielen" - dabei lernt man meiner Meinung nach am besten.
  7. Ich versuche das nochmal präzise zu formulieren: Du möchtest also alles entfernen, was älter ist als 14 Tage und zusätzlich die eventuell noch existierenden VIB-Dateien, die älter sind als die älteste VBK-Datei die (noch) jünger ist als 14 Tage, richtig? Die zweite Möglichkeit wäre: Du möchtest alles entfernen, was älter ist als 14, es sei denn, die älteste Datei ist keine VBK-Datei. Dann sollen noch alle VIB-Dateien aufbewahrt werden, bis zur nächsten VBK-Datei, richtig? Beides mit Powershell kein Problem. ;) :wink2:
  8. Woran erkennt man denn zusammengehörige Dateien? ... am Namen? Wenn das eindeutig zu bestimmen ist, brauchst Du doch nur das Alter der entsprechenden "Hauptdatei" ermitteln und bei den zugehörigen Dateien nicht nach dem Alter entscheiden, sondern nach dem Namen, ob sie weg können oder nicht.
  9. Wenn Du eine Fehlermeldung bekommst, wäre es natürlich für die Fehlerbeseitigung hilfreich, zu wissen, welche Fehlermeldung Du bekommst. Für sowas reicht üblicherweise ein Einzeiler … ungefähr so: Get-ChildItem -Path '\\wechselplatte\Sicherung\*' -Include *.vbk,*.vib | Where-Object ($_.CreationTime -lt ((Get-Date).AddDays(-14))) | Remove-Item -WhatIf
  10. ... oooops, sorry. Mein Fehler. Ich hatte angenommen, dass wir alle schon im Jahr 2017 angekommen wären. ;) :D :cool: :p :schreck:
  11. Kannst Du keine Foreach-Schleife benutzen?
  12. Da hat der Chef durchaus erstmal recht. Aber ist es auch mit einem vertretbaren Aufwand möglich? Meistens fängt man solche "Manager" mit dem finanziellen Aspekt ein. Du kannst ihm ja anbieten, Dich Vollzeit für 2 oder 3 Wochen damit zu beschäftigen. Mal sehen, was er dann meint. ;) :cool: Du musst ja schließlich ALLE möglichen Fälle abdecken und das erfordert eine entsprechende Komplexität. Vermutlich sind ein paar Studies mit Turnschuhen für ein paar Tage billiger. :D
  13. hmmmm ... wie könnte man sowas nur rausbekommen?? ... ich habe ne verrückte Idee - probier es doch einfach mal! :p ;) :D Powershell nimmt Dir eine Menge Arbeit ab ... Du kannst einfach die Größe angeben, dann den Teiler angeben für die Einheit die Du haben willst und voilá - Powershell rechnet es für Dich um .... so hier z.B. 5242880 / 1MB Du kannst in Variablen packen was auch immer Du gerne möchtest. Was willst Du denn eigentlich damit anfangen? Vielleicht gibt es ja eine ganz andere Lösung für Deine Aufgabe ....
  14. Oooops ... ja lustig ... auf die Powershell-Zeile hatte ich gar nicht geachtet .... so sollte es eigentlich funktionieren: Get-ChildItem -Path Y:\* -Recurse -Include *.jpg, *.neg | Where-Object {$_.length -gt 100mb -and $_.Directory -notmatch 'folder1|folder2'} | Sort-Object -Property length | Format-Table fullname, length -AutoSize
  15. Dann kannst Du jetzt natürlich immernoch robocopy anweisen den Header und die Zusammenfassung wegzulassen, die Liste per Powershell einlesen und weiterparsen .... :-D Also so dann .... robocopy Y:\ c:\temp *.jpg *.nef /L /S /XD Folder1 Folder2 /MIN 104857600 /FP /NJH /NJS /NDL /XX
  16. Ich weiß, es klingt ein bissl "von hinten durch die Brust ins Auge", aber wenn es Dir nur ums Auflisten geht (Du hast ja schließlich ein "ft" am Ende, kannst Du dafür prima robocopy benutzen. Mit der Option /L werden die gefundenen Dateien nur aufgelistet - nicht kopiert. Mit der Option /XD schließt Du Verzeichnisse aus und mit /MIN beschränkst Du die Suche auf Dateien einer bestimmten Mindesgröße .... und schneller dürfte robocopy vermutlich auch noch sein. robocopy Y:\ c:\temp *.jpg *.nef /L /S /XD Folder1 Folder2 /MIN 104857600 /FP ... also so sollte es eigentlich gehen ... und es lässt sich auch noch erweitern wenn Du magst. ;-)
  17. Was heißt "Es funktioniert nicht"? Bekommst Du einen Fehler, oder bekommst Du nicht die Ausgabe, die Du erwartest? Probier ma so: $SearchBase = 'OU=OU_Name,DC=domain,DC=com' Get-ADUser -Filter * -SearchBase $SearchBase -Properties MemberOf | Where-Object {$_.MemberOf -contains 'hier muss der DistinguishedName deiner Security Gruppe rein'} | Sort-Object -Property Name | Select-Object -Property Name
  18. Warum kannst Du das Alter dieser Dateien denn nicht bestimmen? Das funktioniert doch genau so wie bei den PDF-Dateien.
  19. ... naja .... und wo ist da jetzt das Problem?
  20. Wenn ich das jetzt richtig verstanden habe, sind die Text-Dateien dann also jeweils genauso alt wie die PDF-Dateien. Dann brauchst Du doch nur Deinen "Suchfilter" von "nur PDF" auf "PDF und TXT" erweitern und bist am Ziel!? Oder hab ich's doch noch nicht richtig verstanden?
  21. Was heißt: "Warum funktioniert .... nicht?" Was funktioniert denn nicht? "fl" ist der Alias für Format-List und mit "pa*" schränkst Du die Ausgabe auf alle Eigenschaften ein, die mit "pa" beginnen. Das ergibt bei mir z.B. "ParentFolder" und "ParentPath". Bei mir funktioniert das. Dafür funktioniert in meiner Umgebung der erste Befehl so nicht. (Exchange 2013 auf Windows Server 2012R2).
  22. Du machst Dir's gern selbst ein bissl schwer, oder? ;) # *** THIS SCRIPT IS PROVIDED WITHOUT WARRANTY, USE AT YOUR OWN RISK *** $testcomputers = "PCHostName1", "PCHostname2" #oder Get-Content -Path 'C:\computers.txt' $exportLocation = 'C:\pcInventoryPC.csv' # PC Connection Test bevor die PC´s ihre Inventur bekommen (Wenn online = speichern in live-PCs.txt Start Inventory, wenn offline = Gespeichert in dead.pcs.txt = keine Aktion) foreach ($computer in $testcomputers) { if (Test-Connection -ComputerName $computer -Quiet -count 1){ Add-Content -value $computer -path C:\livePCs.txt }else{ Add-Content -value $computer -path C:\deadPCs.txt } } # Nun wissen wir welche PC online sind # Prozedur mit der Inventory $computers = Get-Content -Path 'C\livePCs.txt' $Inventory = foreach ($computer in $computers) { $Bios = Get-WmiObject win32_bios -Computername $computer $Hardware = Get-WmiObject Win32_computerSystem -Computername $computer $Sysbuild = Get-WmiObject Win32_WmiSetting -Computername $computer $OS = Get-WmiObject Win32_OperatingSystem -Computername $computer $Networks = Get-WmiObject Win32_NetworkAdapterConfiguration -ComputerName $computer | Where-Object {$_.IPEnabled} $driveSpace = Get-WmiObject win32_volume -computername $Computer -Filter 'drivetype = 3' | Select-Object PScomputerName, driveletter, label, @{LABEL='GBfreespace';EXPRESSION={'{0:N2}' -f($_.freespace/1GB)} } | Where-Object { $_.driveletter -match 'C:' } $cpu = Get-WmiObject Win32_Processor -computername $computer $username = Get-ChildItem "\\$computer\c$\Users" | Sort-Object LastWriteTime -Descending | Select-Object Name, LastWriteTime -first 1 [ARRAY]$MonitorList = Get-WmiObject -Class WMIMonitorID -Namespace root\wmi -ComputerName $computer [PSCustomObject]@{ ComputerName = $Computer.ToUpper() Manufacturer = $Hardware.Manufacturer Model = $Hardware.Model Processor_Type = $cpu.Name System_Type = $Hardware.SystemType Operating_System = $OS.Caption Operating_System_Version = $OS.version Operating_System_BuildVersion = $SysBuild.BuildVersion Serial_Number = $Bios.serialnumber IP_Address = $Networks.IpAddress[0] MAC_Address = $Networks.MACAddress Last_User = $username.Name User_Last_Login = $username.LastWriteTime 'C:_FreeSpace_GB' = $driveSpace.GBfreespace Total_Memory_GB = [math]::round($Hardware.TotalPhysicalMemory/1024/1024/1024, 2) Last_ReBoot = $OS.ConvertToDateTime($OS.LastBootUpTime) Monitor1Hersteller = If($MonitorList[0]){($MonitorList[0].ManufacturerName -notmatch '^0$' | ForEach-Object {[CHAR]$_}) -join ''}Else{'N/A'} Monitor1Typ = If($MonitorList[0]){($MonitorList[0].UserFriendlyName -notmatch '^0$' | ForEach-Object {[CHAR]$_}) -join ''}Else{'N/A'} Monitor1Seriennummer = If($MonitorList[0]){($MonitorList[0].SerialNumberID -notmatch '^0$' | ForEach-Object {[CHAR]$_}) -join ''}Else{'N/A'} Monitor2Hersteller = If($MonitorList[1]){($MonitorList[1].ManufacturerName -notmatch '^0$' | ForEach-Object {[CHAR]$_}) -join ''}Else{'N/A'} Monitor2Typ = If($MonitorList[1]){($MonitorList[1].UserFriendlyName -notmatch '^0$' | ForEach-Object {[CHAR]$_}) -join ''}Else{'N/A'} Monitor2Seriennummer = If($MonitorList[1]){($MonitorList[1].SerialNumberID -notmatch '^0$' | ForEach-Object {[CHAR]$_}) -join ''}Else{'N/A'} Monitor3Hersteller = If($MonitorList[2]){($MonitorList[2].ManufacturerName -notmatch '^0$' | ForEach-Object {[CHAR]$_}) -join ''}Else{'N/A'} Monitor3Typ = If($MonitorList[2]){($MonitorList[2].UserFriendlyName -notmatch '^0$' | ForEach-Object {[CHAR]$_}) -join ''}Else{'N/A'} Monitor3Seriennummer = If($MonitorList[2]){($MonitorList[2].SerialNumberID -notmatch '^0$' | ForEach-Object {[CHAR]$_}) -join ''}Else{'N/A'} } ### End PSCustomObject } ### End Foreach Computer $Inventory $Inventory | Export-Csv $exportLocation -NoTypeInformation -Force ... den Rest darfst Du gern selbst noch ein bissl verbessern.
  23. na das klingt doch supi .... dann denke ich, würde es sich für Dich bestimmt lohnen, Dir die Basics von Powershell mal "geordnet, strukturiert und didaktisch vernünftig aufbereitet" überzuhelfen. ;-) Hier sind ein paar Ressourcen verlinkt, die Dir einen guten Einstieg ermöglichen sollten. Besonders die beiden "Jump Starts", die in Jeffrey's Post verlinkt sind, sind sehr zu empfehlen. https://powershell.org/forums/topic/using-csv-files/
  24. hmmm .... ich hätte es ja jetzt noch interessant gefunden, zu erfahren, für welche Lösung Du Dich entschieden hast .... ;)
×
×
  • Neu erstellen...