Bilder an der PowerShell mit Guetzli komprimieren (rekursiv)

Mit der Kompression von JPGs mit dem Guetzli-Algorithmus spart man ganz ordentlich Platz auf der Platte, ohne Qualität zu verlieren.

Je nach Bild (und Quelle) sind gut und gerne 30-60% Ersparniss drin. Manche (Handy-)Kamera legt JPGs nämlich quasi unkomprimiert ab.

Ein kleines Bulk-Kompress-Script für die bash shell hatten wir hier ja schon. Aus aktuellem Anlass, hier die schnelle PowerShell-Variante (ohne Parameterfehler):

mach-huetzli.ps1 <Ordner>

param (
    [string]$path = (split-path -parent $MyInvocation.MyCommand.Definition)
)

# PFAD zum Guetzli Binary
$guetzli = "C:\PFAD ZU GUETZLI\guetzli_windows_x86-64.exe"

Get-ChildItem -Path $path -recurse -Include @("*.png","*.jpeg","*.jpg") | % {
    $in = $_.FullName
    $out = $in.Replace($_.Extension, '.compressed.jpg')
    write-host "Processing $out" -ForegroundColor Green

    & $guetzli --quality 85 `"$in`" `"$out`"
} 

PowerShell: Computer nach Betriebssystem aus dem Active Directory auflisten

Server nach Betriebssystem auflisten

Und wieder ein schneller PowerShell Schnipsel, den man als Admin häufiger mal brauchen kann.

Alle aktiven Computer nach Betriebssystem auflisten, oder auch nur alle Maschienen mit einer bestimmten Version ausgeben:

Get-ADComputer -Filter 'operatingsystem -like "Windows Server 2022*" -and enabled -eq "true"' -Properties Name,Operatingsystem,OperatingSystemVersion,IPv4Addres
s | ft Na*,Op*,IPv4*

Die ft Pipe am Ende sorgt nur für eine lesbare Ausgabe, weil Get-ADComputer sonst immer den vollständigen DN ausgibt.

Die Abfrage kann man so sehr schnell anpassen. Zum Beispiel für eine Ausgaben von ausschliesslich Client-PCs (-notlike "*server*"):

Get-ADComputer -Filter 'operatingsystem -notlike "*server*" -and enabled -eq "true"' -Properties Name,Operatingsystem,OperatingSystemVersion,IPv4Addres
s | ft Na*,Op*,IPv4*

PowerShell ISE an der PowerShell installieren

Manchmal braucht man nur „mal eben“ ein Feature. Das ist hier grade passiert mit dem Commandlet Out-Gridview. Für einen Benutzer sind grafische Ausgaben oft sehr sinnvoll und das Tool gehört ja „leider“ nur zur Powershell ISE und lässt sich nicht einzeln installieren.

Lösung

Die PowerShellISE direkt an der PowerShell installieren:

Import-Module servermanager; Add-windowsFeature powershell-ise

VMware vSphere vSwitch Portgruppe(n) und VLANs von einem Host auf einen anderen kopieren

Manchmal möchte man „einfach“ alle Portgruppen von einem vSwitch auf einen anderen kopieren. Entweder auf dem selben ESXi-Host, oder auch gleich auf einen neuen ESXi. Die Inbetriebnahme neuer VMware ESXi-Hosts wird dadurch merklich schneller möglich.

Lösung

Ohne PowerShell (PowerCLI) geht’s natürlich nicht, solange man keine Hostprofile nutzt.

Das Script benötigt das VMware PowerShell PowerCLI Modul:

Install-Module VMware.PowerCLI

Und natürlich eine funktionierende Verbindung zum vCenter Server:

Connect-VIServer <VCENTER-SERVER>

Dann lässt sich mit diesen Zeilen die Konfiguration schnell kopieren:

## ESXi source / destination
$esx_s = Get-VMHost vmware3.pmd5.org
$esx_d = Get-VMHost hhvmware3.pmd5.org

## vSwitch name source / destination
$vswitch_s = "vSwitch0"
$vswitch_d = "vSwitch0"

$portgroup = $esx_s | Get-VirtualSwitch -Name $vswitch_s | Get-VirtualPortGroup | Select-Object Name, vlanid
$vswitch = $esx_d | Get-VirtualSwitch -Name $vswitch_d 

foreach ($pg in $portgroup) {
    Write-Host "Erstelle Portgruppe {0} mit vlanid {1}" -f $pg.name, $pg.vlanid
    try {
        New-VirtualPortGroup -VirtualSwitch $vswitch -Name $pg.name -VlanId $pg.vlanid -ErrorAction Stop
    }
    catch {
        "Gibt es schon"
    }
}

Windows Treiber via PowerShell installieren (Windows Server Core)

Treiber unter Windows an der Kommandozeile erstellen

Unter Windows Server 2012R2/2016/2019/2022 Core oder dem (kostenfreien) Hyper-V-Server gibt es bekanntlich keine GUI und konsequenterweise daher auch keinen Gerätemanager. Selbiger lässt sich auch nicht immer, vor allem wenn man noch „alleine“ ist, remote ansprechen. Wie kann man also da jetzt Treiber installieren/aktualisieren/entfernen? Also wie bekommt man Treiber auf einen Core Server?

Das kann man zum Glück ganz gut mit der PowerShell machen; genauer gesagt mit den guten alten CMD-Werkzeugen pnputil und devcon. Selbige kann man aber aus PowerShell-Schleifen heraus komfortabel starten.

Einen Treiber installieren

Man fügt einen bestimmten Treiber mit pnputil zum Windows-Treiber Repository hinzu.

pnputil.exe -i -a <PFAD>\oemdriver.inf

Alle Treiber aus dem aktuellen Verzeichnisses (mit Unterverzeichnissen) installieren

Zum Beisipel aus HPE oder DELL Repositories kann man so „mal eben“ alles in einem Rutsch zu Windows hinzufügen:

Get-ChildItem -Filter *.inf -Recurse | Select-Object FullName | ForEach-Object {pnputil -a $_.FullName}

Auflisten aller 3rd Party Treiber im Repository

Zeigt, auch unter einem „normal“ laifenden Windows, alle Dritt-Treiber an.

pnputil.exe -e

Entfernen eines Treibers aus Windows

Der <NAME> des Treibers findet sich in der Ausgabe von pnputil -e unter „Veröffentlichter Name“.

pnputil.exe -d oem<NAME>.inf