News Windows-Werkzeugkasten: PowerToys 0.100 bringt größtes Update seit Langem

MaverickM schrieb:
Aber das Ding heißt ja nicht umsonst PowerToys
Wie so oft ein der Werbung muss ein Name toll sein. 😉
Damals schon waren das, ich vergreife mich mal, nette Dreingaben die das Leben ordentlich erleichterte und bei denen man zu recht fragte warum das nicht Teil vom Betriebssystem ist - verglichen mit Krücken wie Notepad oder Paint.
Klar habe ich auch nicht all gebraucht die im Päckchen waren.

Kann mir einer den Nutzen der Befehlspalette verklickern wenn es ein Startmenü gibt..?
Oder diese FancyZones mit den Fenstergruppen? Scheibe ich ein Word oder sonstwas so zusammen, dass es von mir aus 1/4 meiner bescheidenen 1920×1080 belegt - was kann ich mit so einem Teil noch anfangen wenn de Nutzfläche vllt. die Hälfte dieses Quetschfensters ist? Oder andersrum - was für eine Megamonitor muss ich zu stehen haben um so einen Fensterzoo arrangiert haben zu wollen?!

Wie auch immer - einen netten Vorteil haben die PowerToys: ich kann sie in die Systeme einklinken und spare mir gewisse einzelne Tools. So manches Zubehör konnte weg.

Sind halt doch ’n bissl hilfreich, gell?

CN8
 
Mit dem TotalCommander ist das Umbenennen ein Kinderspiel.
1781197408456.png

Ergänzung ()

cumulonimbus8 schrieb:
Oder andersrum - was für eine Megamonitor muss ich zu stehen haben um so einen Fensterzoo arrangiert haben zu wollen?!
Ich habe im Büro 3 Monitore nebeneiander. Jeweils 4k. Da passt schon was drauf.
 
  • Gefällt mir
Reaktionen: wuselsurfer und Caramon2
cumulonimbus8 schrieb:
Kann mir einer den Nutzen der Befehlspalette verklickern wenn es ein Startmenü gibt..?

Die nutze ich zwar persönlich nicht, aber die Befehlspalette kann deutlich mehr als nur Apps starten bzw. das, was das Startmenü kann.

cumulonimbus8 schrieb:
Oder diese FancyZones mit den Fenstergruppen? [...] was für eine Megamonitor muss ich zu stehen haben um so einen Fensterzoo arrangiert haben zu wollen?!

Ich habe ein Multi-Monitor-Setup mit zwei Ultrawides und ich nutze mehrere verschiedene FancyZone Layouts, die ich per Hotkeys umschalten kann, je nachdem wie ich mein Fenster-Layout aktuell brauche. Eine der besten Funktionen in PowerToys überhaupt.
 
cumulonimbus8 schrieb:
muss ein Name toll sein.
Es ist mir eigentlich völlig Wurscht wie sich so ein Tool nennt, Hauptsache es macht, was es soll, nach meinen Wünschen, Falls ich denn mal wieder zu Windows umschalte und einige Dateien umbenennen muss oder will nutze ich dafür den MultiCommander (Toller Name, gelle) damit lassen sich auch ganz schnell viele Dateien egal welcher Art auf einen Rutsch umbenennen.
 
  • Gefällt mir
Reaktionen: qualle
@Caramon2 Ich habe mir jetzt selbst (mit Nachhilfe von KI...) ein kleines PS-Script geschrieben, um alle Dateien in einem Ordner nach einem Muster umzubenennen (ist vielleicht auch für andere interessant).

Gemacht werden sollte das, was nur in der JS-Funktionalität des BR zur Verfügung steht (aber die ca. 20 $ waren mir jetzt einfach zu viel dafür):

Javascript:
var sp = name.split("_");
var pr = sp[0] + "_" + sp[1];

setState(pr, getState(pr, 0) + 1);

newName = pr + "_" + padNum(getState(pr, 1), 2) + "_" + padNum(counter * 10, 4);

sprich, füge jedem Dateinamen zwei Counter hinzu: Einen Zähler, der sich auf das Präfix davor bezieht, und einen globalen Zähler. Padde außerdem die Zähler und erhöhe den globalen Zähler jew um 10.

rename1.ps1:

PowerShell:
# 1. Pfad zu Ihren Dateien definieren
$ordnerPfad = Resolve-Path ".\fotos-ai"

# 2. Hashtable als Zustandsspeicher für die Präfixe (wie getState/setState)
$state = @{}

# 3. Globaler Schleifenzähler für das Ende des Namens
$counter = 1

# 4. Alle Dateien im Ordner abrufen, NACH ERSTELLUNGSDATUM SORTIEREN und durchlaufen
# HINWEIS: Verwenden Sie 'CreationTime' für das Erstellungsdatum oder 'LastWriteTime' für das Änderungsdatum
Get-ChildItem -File $ordnerPfad | Sort-Object CreationTime | ForEach-Object {
    $datei = $_
    $nameOhneEndung = $datei.BaseName
    $endung = $datei.Extension

    # Text am Unterstrich aufteilen (wie name.split("_"))
    $sp = $nameOhneEndung.Split("_")

    # Prüfen, ob mindestens zwei Teile für das Präfix existieren
    if ($sp.Count -ge 2) {
        # Präfix zusammenbauen (wie pr = sp[0] + "_" + sp[1])
        $pr = $sp[0] + "_" + $sp[1]

        # Zustand abrufen und erhöhen (wie setState(pr, getState(pr, 0) + 1))
        if (-not $state.ContainsKey($pr)) {
            $state[$pr] = 0
        }
        $state[$pr]++

        # Werte für die Formatierung vorbereiten
        $aktuellerIndex = $state[$pr]
        $counterWert = $counter * 10

        # Neuen Namen mit Padding zusammenbauen
        # {0:D2} füllt auf 2 Stellen auf, {1:D4} füllt auf 4 Stellen auf
        $neuerName = "{0}_{1:D2}_{2:D4}{3}" -f $pr, $aktuellerIndex, $counterWert, $endung
        $zielPfad = Join-Path $ordnerPfad $neuerName

        # Erweiterte Sicherheitsprüfung:
        # Nur in die Schleife gehen, wenn die Datei existiert UND es NICHT die aktuelle Datei selbst ist
        $konfliktZaehler = 1
        while ((Test-Path $zielPfad) -and ($zielPfad -ne $datei.FullName)) {
            $neuerName = "{0}_{1:D2}_{2:D4}_{4}{3}" -f $pr, $aktuellerIndex, $counterWert, $endung, $konfliktZaehler
            $zielPfad = Join-Path $ordnerPfad $neuerName
            $konfliktZaehler++
        }

        # Nur umbenennen, wenn sich der Name überhaupt ändert
        if ($datei.Name -ne $neuerName) {
            Rename-Item -Path $datei.FullName -NewName $neuerName
            Write-Host "Umbenannt: $($datei.Name) -> $neuerName"
        } else {
            Write-Host "Unverändert (bereits korrekt): $($datei.Name)" -ForegroundColor Gray
        }

        # Globalen Zähler für die nächste Datei erhöhen
        $counter++
    }
}

Write-Host "`nFertig! Alle Dateien wurden verarbeitet." -ForegroundColor Green

# 5. PAUSE-ANWEISUNG: Hält das Fenster offen
Write-Host ""
Read-Host "Drücken Sie die ENTER-Taste, um dieses Fenster zu schließen..."

Dieses Script kann sogar gefahrlos mehrmals auf demselben Ordner ausgeführt werden... denn wenn sich nichts ändert, wird "Unverändert" ausgegeben.

Um es mal zu testen, muss nur der Pfad in Zeile 2 angepasst werden. (Und alle Dateinamen müssen vorher ein passendes Präfix haben...)

Das entsprechende bash-Pendant sollte auch sehr ähnlich zu diesem Script sein.

Beispiel vorher (umgekehrt nach Änderung sortiert):

1781262750287.png


Beispiel nachher (umgekehrt nach Änderung sortiert):

1781262956635.png


(nach Name sortiert):

1781263053048.png


Ich weiß also, was ich (global oder jeweils thematisch) zuletzt gemacht hatte.

PS: Sehe gerade, die Qualle fällt etwas aus der Reihe, weil hier (als Einziges) das Änderungsdatum (Explorer) nicht mit dem Erstellungsdatum (Script) übereinstimmt (das Änderungsdatum liegt hier vor dem Erstellungsdatum... aber das ist ein anderes Thema).
 
qualle schrieb:
Um es mal zu testen, muss nur der Pfad in Zeile 2 angepasst werden. (Und alle Dateinamen müssen vorher ein passendes Präfix haben...)
Mangels Powershell (nur Windows XP Home per VM vorhanden) kann ich es nicht testen. Ich würde das Verzeichnis aber nicht fest "verdrahten", sondern es einfach im aktuellen Verzeichnis ausführen lassen.

Vorstellbar wäre auch, die umzubenennenden Dateien per Mehrfachauswahl zu selektieren und dann auf's Skript zu ziehen, oder per RMB/Öffnen mit …, wenn du einen Starmenü-Eintrag dafür hast. - Zumindest theoretisch: Damit habe ich noch nicht experimentieren.

Dann würde vermutlich auch das mit der Sortierung im Dateimanager (nach Name, Größe, Datum) funktionieren.

qualle schrieb:
Das entsprechende bash-Pendant sollte auch sehr ähnlich zu diesem Script sein.
Falls du die Unterhaltung noch hast, lasse es dir doch bitte auch noch für bash erstellen: Nach meinen Erfahrungen *) sind Powershell-Skripte komplexer als die Bash-Version.


*) da ich in bash-Programmierung nicht sonderlich geübt bin, lasse ich mich auch gerne von einer KI (Opera, Google, oder beide zum Vergleich) helfen und gelegentlich auch zeigen, wie das bei Windows aussehen würde.

Der Witz daran: Als ich das erste Mal nach einem Windows-Pendant gefragt habe, meinte die Opera-KI: Per Powershell wäre das zu umständlich, man sollte bei Windows besser das Bash-Skript per WSL2 nutzen. - Damit hatte ich überhaupt nicht gerechnet! - Das war aber auch nur dieses eine Mal.

Ich habe es mir dann trotzdem erstellen lassen und konnte der KI nur zustimmen.

Es ging darum, alle meine ePub (Perry Rhodan seit 2010 als eBook, vorher seit 1983 als tote Bäume) in einem Rutsch in reine Textdateien zu konvertieren, um bei Bedarf eine Volltext-Suche über alle laufen zu lassen.

Da ePubs praktisch nur umbenannte ZIP-Archive sind und normale HTML-Dateien enthalten (eine pro Kapitel), wäre das zwar rel. trivial. Nur es ging eben um 700 Bände, die in einem Rutsch in je eine Textdatei/Bande mit dessen Namen konvertiert werden sollten: Nach for n in *.epub wusste ich nicht mehr weiter. ;)


Nachtrag:

Ich hatte noch die Mail, in der ich das einem Bekannten erklärt habe:
Bash:
for n in *.epub;do 7z x "$n" -oeBooks/"${n%.epub}"/ > /dev/null;done && find eBooks/ -iname "nav.*html" -delete
for n in eBooks/*;do d=$(find "$n" -iname "*.*html" -exec dirname {} \; | grep -vi bookwire | sort -u | head -n 1);w3m -cols 999999999 "$d/"*.*html > "$n.txt";done
mkdir -p Text && mv eBooks/*.txt Text/ && rm -rf eBooks

1. entpackt die ePubs unter ihren Namen ("${n%.epub}" entfernt das ".epub", " > /dev/null" unterdrückt die Ausgabe) im automatisch erstellten Unterverzeichnis "eBooks" und entfernt anschließend die Inhaltsverzeichnisse

2. konvertiert die gefundenen *.*html, mit Ausnahme von "bookwire" (Werbung), in die jeweiligen Textdateien im "eBooks"-Verzeichnis

3. die dann ins neu erstellte "Text"-Verzeichnis verschoben werden und anschließend das "eBooks"-Verzeichnis löscht

- "sort -u" sortiert die Pfade der Treffer eines eBooks (= zu jeder enthaltenen *.*html Datei) und entfernt doppeltes

- "head -n 1" übergibt nur den ersten Pfad, da w3m alle *.*html Datei in einer Textdatei zusammenfasst

- "-cols 999999999" ist sozusagen unendliche Zeilenlänge: Normalerweise umbricht w3m nach 80 Zeichen, ich bevorzuge aber Fießtext.

Die ePubs müssen dazu in ein leeres Verzeichnis kopiert werden, in dem dann das Terminal geöffnet wird.


Und das ist das dokumentierte, vereinfachte (nur noch eine Schleife und mit Statusausgabe) Skript, wie ich es zuletzt überarbeitet hatte:
Bash:
#!/bin/bash
mkdir -p Text || exit   # falls das Zielverzeichnis nicht erstellt werden kann

# Alle "*.epub" im aktuellen Verzeichnis ins automatisch erstellte Verzeichnis "temp" entpacken,
# deren Inhaltsverzeichnisse löschen und die restlichen HTML-Dateien außer "bookwire" (Werbung)
# in eine Textdatei pro Band in den Ordner "Text" konvertieren:

for n in *.epub
 do t=${n%.epub};echo $t
 7z x "$n" -otemp/"$t"/ > /dev/null
 find temp/"$t" -iname "nav.*html" -delete
 d=$(find temp/"$t" -iname "*.*html" -exec dirname {} \; | grep -vi bookwire | sort -u | head -n 1)
 w3m -cols 999999999 "$d/"*.*html > "Text/$t.txt"
done && rm -rf temp
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: qualle
Caramon2 schrieb:
Falls du die Unterhaltung noch hast, lasse es dir doch bitte auch noch für bash erstellen: Nach meinen Erfahrungen *) sind Powershell-Skripte komplexer als die Bash-Version.

Klar... Google vergisst ja so schnell nix. ;)

Bash:
#!/bin/bash

# 1. Pfad zu Ihren Dateien definieren (wird in absoluten Pfad aufgelöst)
ORDNER_PFAD=$(realpath "./fotos-ai")

# 2. Deklaration eines assoziativen Arrays (Hashtable für Präfixe)
declare -A state

# 3. Globaler Schleifenzähler für das Ende des Namens
counter=1

echo -e "\e[32mStarte Umbenennung...\e[0m"

# 4. Dateien nach Änderungsdatum sortiert durchlaufen (Älteste zuerst)
# 'stat -c "%Y %p"' liest Zeitstempel und Pfad aus, 'sort -n' sortiert numerisch
stat -c "%Y %p" "$ORDNER_PFAD"/* 2>/dev/null | sort -n | while read -r mtime voller_pfad; do
    
    # Prüfen, ob es sich wirklich um eine Datei handelt (kein Unterordner)
    if [ -f "$voller_pfad" ]; then
        datei_name=$(basename "$voller_pfad")
        endung="${datei_name##*.}"
        name_ohne_endung="${datei_name%.*}"
        
        # Falls die Datei keine Endung hat, Punkt-Logik umgehen
        if [ "$name_ohne_endung" = "$datei_name" ]; then
            endung=""
        else
            endung=".$endung"
        fi

        # Text am Unterstrich aufteilen (IFS temporär ändern)
        IFS='_' read -r -a sp <<< "$name_ohne_endung"

        # Prüfen, ob mindestens zwei Teile für das Präfix existieren (${#sp[@]} ist die Anzahl)
        if [ ${#sp[@]} -ge 2 ]; then
            # Präfix zusammenbauen (sp[0] + "_" + sp[1])
            pr="${sp[0]}_${sp[1]}"

            # Zustand abrufen und erhöhen (wie setState)
            if [ -z "${state[$pr]}" ]; then
                state[$pr]=0
            fi
            ((state[$pr]++))

            # Werte für die Formatierung vorbereiten
            aktueller_index=${state[$pr]}
            counter_wert=$((counter * 10))

            # Neuen Namen mit Padding zusammenbauen (printf %02d = 2 Stellen, %04d = 4 Stellen)
            printf -v neuer_name "%s_%02d_%04d%s" "$pr" "$aktueller_index" "$counter_wert" "$endung"
            ziel_pfad="$ORDNER_PFAD/$neuer_name"

            # Erweiterte Sicherheitsprüfung:
            # Nur in die Schleife gehen, wenn die Datei existiert UND es NICHT die aktuelle Datei selbst ist
            konflikt_zaehler=1
            while [ -e "$ziel_pfad" ] && [ "$ziel_pfad" != "$voller_pfad" ]; do
                printf -v neuer_name "%s_%02d_%04d_%d%s" "$pr" "$aktueller_index" "$counter_wert" "$konflikt_zaehler" "$endung"
                ziel_pfad="$ORDNER_PFAD/$neuer_name"
                ((konflikt_zaehler++))
            done

            # Nur umbenennen, wenn sich der Name überhaupt ändert
            if [ "$datei_name" != "$neuer_name" ]; then
                mv "$voller_pfad" "$ziel_pfad"
                echo "Umbenannt: $datei_name -> $neuer_name"
            else
                # Grauer Text für unveränderte Dateien
                echo -e "\e[90mUnverändert (bereits korrekt): $datei_name\e[0m"
            fi

            # Globalen Zähler für die nächste Datei erhöhen
            ((counter++))
        fi
    fi
done

echo -e "\n\e[32mFertig! Alle Dateien wurden verarbeitet.\e[0m"

# 5. PAUSE-ANWEISUNG: Hält das Fenster offen
echo ""
read -p "Drücken Sie die ENTER-Taste, um dieses Fenster zu schließen..."

Sieht einigermaßen ähnlich aus... In Zeile 2 würde ich noch ein set -e hinzufügen und die echo-Anweisungen sind natürlich eher optischer Natur. Probier das mal aus, bitte, bei mir läuft momentan nur Win.


Noch eine zusätzliche Erklärung von der KI:

Technische Besonderheiten in Bash:

realpath: Macht aus dem relativen Pfad einen absolut gültigen Pfad, genau wie Resolve-Path in PowerShell.

declare -A state: Erstellt ein assoziatives Array. Das ist das direkte Gegenstück zu Ihrer JavaScript- oder PowerShell-Hashtable.

stat -c "%Y %p" ... | sort -n: Dieser Befehl liest die Modifikationszeit (%Y) und den Pfad (%p) aller Dateien aus und sortiert sie chronologisch (älteste Datei zuerst).

printf -v neuer_name "%s_%02d_%04d%s": Das ist das Äquivalent zu Ihrer padNum-Funktion. %02d erzwingt die führenden Nullen auf 2 Stellen, %04d auf 4 Stellen.

\e[32m und \e[90m: Steuern die Farben im Terminal (Grün für Erfolg, Grau für unveränderte Dateien).
Ergänzung ()

Es gibt noch zwei Anmerkungen von ShellCheck, die aber vermutlich ignoriert werden dürfen:

Code:
$ shellcheck myscript
 
Line 16:
stat -c "%Y %p" "$ORDNER_PFAD"/* 2>/dev/null | sort -n | while read -r mtime voller_pfad; do
>>                                                                     ^-- SC2034 (warning): mtime appears unused. Verify use (or export if used externally).
 
Line 81:
read -p "Drücken Sie die ENTER-Taste, um dieses Fenster zu schließen..."
^-- SC2162 (info): read without -r will mangle backslashes.

"mtime" erkennt er glaube ich nicht als Zeichenkette/String - und "read -p" oder "read -pr" ist glaube ich Jacke wie Hose.
 
Zuletzt bearbeitet:
qualle schrieb:
Ich habe mir jetzt selbst (mit Nachhilfe von KI...) ein kleines PS-Script geschrieben, um alle Dateien in einem Ordner nach einem Muster umzubenennen
Nichts für ungut, dass du es mit uns Teilst, aber eigentlich völlig überflüssig da wir mittlerweile wissen das es zig andere Apps und Programme gibt, die das auch mit einer GUI machen.
 
Der Puritaner schrieb:
da wir mittlerweile wissen das es zig andere Apps und Programme gibt, die das auch mit einer GUI machen.
Gibst du mir dann die 30 $ für die Pro-Version vom BulkRenamer? Danke.
 
Micha- schrieb:
Ich habe im Büro 3 Monitore nebeneiander. Jeweils 4k. Da passt schon was drauf.
Bisschen sticheln: bei einem Sch-Lapp-top hat man verloren 😉
 
  • Gefällt mir
Reaktionen: qualle
qualle schrieb:
Probier das mal aus, bitte, bei mir läuft momentan nur Win.
Das sehe ich mir morgen an: Ich habe gerade noch, bevor ich den PC runterfahre, hier rein gesehen und war mit den Gedanken schon fast in der Küche (dann gemütlicher Film-Abend). :)

Btw: Das funktioniert auch mit einem Livesystem. - Z. B. bei Zorin kann man gleich nach dem booten die Sprache (und damit voe allem das Tastenlayout) wählen: s. hier den 2. Screenshot (der 1. zeigt übrigens wie man ISOs am einfachsten bootet ;))

qualle schrieb:
und "read -p" oder "read -pr" ist glaube ich Jacke wie Hose.
In dem Fall sogar vollkommen egal, da ja nicht mal eine Variable angegeben ist, so dass jede Eingabe außer Enter nichts bewirkt:

-r Do not treat a <backslash> character in any special way. Consider each <backslash> to be part of the input line.
 
  • Gefällt mir
Reaktionen: qualle
Dafür liebe ich den Total Commander: man sieht alles im Voraus.
Und die paar Euro für die Vollversion haben sich längst in mehrfacher Zeitersparnis rentiert.

Programmieren muß man da gar nichts, nur ab und zu ein paar Dateien nicht auswählen.
700 Dateien gehen in sekundenschnelle.
 
Zurück
Oben