Posts mit dem Label Powershell werden angezeigt. Alle Posts anzeigen
Posts mit dem Label Powershell werden angezeigt. Alle Posts anzeigen

Mittwoch, 24. Mai 2017

Powershell: Viele Files einzeln löschen

Um so länger man sich nicht um seinen Server kümmert, umso mehr arbeit steht einem bei einem Upgrade oder bei Problemen bevor.

Vorgeschichte: Seit mehreren Jahren betreibe ich unterschiedliche Server mit mehr oder minderen Erfolg....

Nun wird aber immer mehr der Speicherplatz belegt. Aber was mir jetzt bei einem Server untergekommen ist, habe ich noch nie gesehen.

Bei der Suche nach löschbaren Files ist mir der Datenträgerbereinigungsassisten immer hängen geblieben. Nach Durchsicht, welche Schritte er durchführt bin ich über das Löschen des TEMP-Verzeichnisses auf C:\Windows\Temp gestoßen.

Lt. Explorer, welcher es nicht einmal schaffte, alles fertig zu laden, zeigte in etwa mehr als 3 Mio. Files an.



Wie kann man also ein Verzeichnis leer räumen, welches schon nicht mal im Explorer zum Ansehen geht.

Naja ganz einfach per Powershell...

$i=0
Get-ChildItem -path "C:\Windows\Temp" -OutBuffer 1 | foreach ($_) {del $_.FullName;Write-Host "Deleting $_";$i++;write-host $i}


Wichtig ist hier der Parameter "-OutBuffer". Dieser gibt an, wie viele Objekte zuerst von Get-ChildItem eingelesen werden, bevor sie an die Pipe weitergegeben werden.

Da das warten bis über 3 Mio. Files eingelesen sein würden zu lange dauert, habe ich mich dafür entschieden, jede Datei einzeln dem Del-Befehl zu übergeben. Dies mag vlt. nicht effizient sein, aber es werden somit wenigstens die Dateien gelöscht (alle anderen möglichkeiten haben im nichts geendet).

Die Ausgabe sieht (inkl. des stylischem Zählwerkes) so aus...



So nun brauche ich nur noch zu warten bis meine 3 Mio Files gelöscht sind...


1. Versuch OHNE Zählwerk


Montag, 2. Januar 2017

Powershell: Einfaches Menü

Mittels Powershell lassen sich so einige Sachen erledigen. So kann man zB. Windows Betriebssysteme so beeinflussen, dass man Software de-/installieren oder Registry-Einstellungen ändern kann. Nun ist es auch so einfach ein interaktives Menü auszubilden. Wir bilden eine eigene Funktion aus wie zB:
function MyCustomMenue
{
     param (
           [string]$Title = 'Select Options'
     )
     cls
     Write-Host "================ $Title ================"
     
     Write-Host "1: Press '1' for this option."
     Write-Host "2: Press '2' for this option."
     Write-Host "3: Press '3' for this option."
     Write-Host "Q: Press 'Q' to quit."
}
Danach kann diese Funktion einfach mittels
     MyCustomMenue
"geladen" werden. Da aber nun noch nicht die Eingabe des Users abgefragt wird, werden noch zusätzlich folgende zeilen angefügt.
     Write-Host
     Write-Host "================================"
     $input = Read-Host "Please make a selection"

     cls
     Write-Host "================================"
     Write-Host
Bei der Zeile $input = Read-Host "Please make a selection" bleibt somit das Powershell-Script stehen und es wird auf eine Eingabe des Users gewartet, welche wiederum in der Variable $input gespeichert wird.

Da nun eigentlich das Script weiterlaufen würde fehlt noch die Logik, welche entscheidet ob die Eingabe des Users korrekt ist. Dies lässt sich am einfachsten mit einem sog. SWITCH erreichen.
switch ($input)
    {
        '1' {
    Write-Host "Selected Option 1"
    #Add Code here
   }
  '2' {
    Write-Host "Selected Option 2"
    #Add Code here
   }
  '3' {
    Write-Host "Selected Option 3"
    #Add Code here
   }
  '4' {
    Write-Host "Selected Option 4"
    #Add Code here
   }
  '5' {
    Write-Host "Selected Option 5"
    #Add Code here
   }
  'q' {
    exit
   }
  default {
     #Add CODE witch is run if the user enters a wrong number
     exit
    }
    }
Wichtig ist hierbei nicht auf den Punkt default zu vergessen, welcher sorge trägt, dass bei einer falschen Eingabe zumindest (in unserem Beispiel) das Powershell-Script beendet wird. Hier kann natürlich auch zB wieder das Menü gezeigt werden oder ein Standardfall angenommen werden.

Zum Abschluss nun das komplette Script:
function MyCustomMenue
{
     param (
           [string]$Title = 'Select Options'
     )
     cls
     Write-Host "================ $Title ================"
     
     Write-Host "1: Press '1' for this option."
     Write-Host "2: Press '2' for this option."
     Write-Host "3: Press '3' for this option."
     Write-Host "Q: Press 'Q' to quit."
}

MyCustomMenue

Write-Host
Write-Host "================================"
$input = Read-Host "Please make a selection"

cls
Write-Host "================================"
Write-Host

switch ($input)
    {
        '1' {
    Write-Host "Selected Option 1"
    #Add Code here
   }
  '2' {
    Write-Host "Selected Option 2"
    #Add Code here
   }
  '3' {
    Write-Host "Selected Option 3"
    #Add Code here
   }
  '4' {
    Write-Host "Selected Option 4"
    #Add Code here
   }
  '5' {
    Write-Host "Selected Option 5"
    #Add Code here
   }
  'q' {
    exit
   }
  default {
                    #Add CODE witch is run if the user enters a wrong number
     exit
    }
    }
Die Ausgabe sieht in etwa so aus:
================ Select Options ================
1: Press '1' for this option.
2: Press '2' for this option.
3: Press '3' for this option.
Q: Press 'Q' to quit.

================================
Please make a selection: 
und nach zB. der Auswahl der Option 1:
================================

Selected Option 1

Donnerstag, 7. Juli 2016

Powershell: Gezählte Computer Liste einer OU-Strucktur

Heute musste ich kurz alle Rechner einer bestimmten OU auswerten. Dies ging am einfachsten mittels Powershell. Als Basis galt folgender Blogeintrage von:



Import-Module ActiveDirectory
Get-ADComputer -SearchBase "OU=Servers,DC=Domain,DC=Name" -Filter {Enabled -eq $true} -Properties CanonicalName | Group-Object {($_.CanonicalName -Split "/")[2]}

Danach erhält man folgenden Ausdruck am Bildschirm:


Count Name                      Group                                                                                                       
----- ----                      -----                                                                                                       
   84 ServerGroup 1                {...}
    3 ServerGroup 2                {...}

Solltet Ihr eine Unter OU benötigen, so ändert einfach die -Searchbase. Dann könnt ihr auch das Split von zb. 2 in ($_.CanonicalName -Split "/")[2] zu 3 ändern. Dies ändert dann auch die Gruppierung.
Fügt Ihr
 | Format-Table Name, Group -AutoSize -Wrap | Out-File C:\Test\text.csv
der CommandLine noch hinzu, könnt Ihr euch die Ausgabe in ein File eurer Wahl schreiben lassen.