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: Misdemeanor, 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.
 
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.
 
steirerblut schrieb:
Für mich eines der unverzichtbarsten Tools unter Windows.

Ich kenne gar nicht alle verfügbaren Tools, die in dieser Produkt-Suite enthalten sind, bin aber schon alt genug, um von Anfang an dabei gewesen sein zu können ... vielleicht ergibt sich das für mich in diesem Sinne nicht, daher sei mir die Frage gestattet: was genau ist daran (für Dich) unverzichtbar? Wofür brauchst Du diese Software oder Teilkomponenten? Würde mich einfach mal interessieren ...
 
qualle schrieb:
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.
Bei mir passierte gar nichts:

num.png

("aaa_", usw. hatte ich übrigens mit MassRename davor gesetzt, da das damit am einfachsten ging)

Den Pfad hatte ich im Skript direkt eingegeben und die Einrückungen verkleinert, da ich das übersichtlicher finde (das Skript aber trotzdem nicht auf Anhieb verstehe und es mir zu aufwändig ist, mich dort einzuarbeiten):
Code:
#!/bin/bash

# 1. Pfad zu Ihren Dateien definieren (wird in absoluten Pfad aufgelöst)
ORDNER_PFAD=/tmp/ramdisk/t

# 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

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.
Da ich mit dem Satz Probleme hatte (Padde sagte mir nichts), hatte ich ihn der Google-KI vorgeworfen, die mir dann auf Wunsch auch ein Bash-Skript dazu gebastelt hat (ohne Pfadvorgabe, es arbeitet einfach im aktuellen Verzeichnis):
Code:
#!/bin/bash

# Konfiguration
PADDING=3          # Anzahl der Stellen für das Padding (z.B. 001)
GLOBAL_STEP=10     # Schrittweite für den globalen Zähler

# Zähler initialisieren
global_counter=$GLOBAL_STEP
declare -A prefix_counters

# Alle Dateien im aktuellen Ordner durchlaufen (ohne Verzeichnisse und das Skript selbst)
for file in *; do
 [[ -f "$file" ]] || continue
 [[ "$file" == "rename_files.sh" ]] && continue

 # Dateiendung extrahieren
 ext="${file##*.}"
 # Dateiname ohne Endung
 filename_no_ext="${file%.*}"
 
 # Präfix ermitteln: Text vor dem ersten Unterstrich oder Leerzeichen
 # Falls kein Trenner existiert, wird der ganze Name genutzt
 prefix=$(echo "$filename_no_ext" | awk -F'[_ ]' '{print $1}')

 # Präfix-Zähler abrufen oder mit 1 initialisieren
 if [[ -z "${prefix_counters[$prefix]}" ]]; then
  prefix_counters[$prefix]=1
 else
  ((prefix_counters[$prefix]++))
 fi

 # Zähler mit führenden Nullen auffüllen (Padding)
 padded_prefix_ctr=$(printf "%0${PADDING}d" "${prefix_counters[$prefix]}")
 padded_global_ctr=$(printf "%0${PADDING}d" "$global_counter")

 # Neuen Dateinamen zusammenbauen
 new_name="${prefix}_${padded_prefix_ctr}_${padded_global_ctr}.${ext}"

 # Datei umbenennen
 echo "Benenne um: '$file' -> '$new_name'"
 mv "$file" "$new_name"

 # Globalen Zähler erhöhen
 ((global_counter += GLOBAL_STEP))
done

Das funktionierte auf Anhieb und dass der vollständige Dateiname erhalten bleibt, wäre ja nur eine kleine Änderung bei # Neuen Dateinamen zusammenbauen:

num2.png

Mein Fazit:

Du brauchst kein Bash-Skript und ich habe dafür auch keine Verwendung, also lass und das hiermit beenden.


Hinweise

Bei Michrosoft gibt es übrigens Seiten zu beidem:
und lt. Google-KI kann man Bash auch ohne das WSL2 mit Windows nutzen:
Ja, man kann Bash-Skripte nativ unter Windows nutzen, völlig unabhängig vom WSL2. Da Windows von Haus aus keinen POSIX-Standard und keinen Bash-Interpreter besitzt, benötigen Sie lediglich eine Laufzeitumgebung, welche die Linux-Systemaufrufe für Windows übersetzt. [1, 2, 3]
Die drei saubersten und etabliertesten Methoden, die komplett ohne Virtualisierung (wie WSL2) oder Container auskommen, sind folgende:

## Methode 1: Git Bash (Der einfachste Weg)
Wenn Sie Git für Windows installieren, wird automatisch eine schlanke Bash-Umgebung mitgeliefert. Diese basiert auf MSYS2 und bringt die wichtigsten GNU-Core-Utilities (wie ls, grep, awk, sed) direkt mit. [4, 5, 6]

* Skript ausführen:
Öffnen Sie das "Git Bash"-Terminal, navigieren Sie zum Ordner und starten Sie das Skript:

bash mein_skript.sh

* Direktaufruf aus PowerShell / CMD:
Wenn Sie bei der Git-Installation die Option wählen, Git zu den Umgebungsvariablen hinzuzufügen, können Sie Bash-Skripte direkt aus der PowerShell aufrufen:

bash.exe .\mein_skript.sh

[5, 6, 7]

## Methode 2: MSYS2 (Der native Weg für Power-User)
MSYS2 stellt eine moderne POSIX-Umgebung für Windows bereit und nutzt (genau wie Arch oder Artix) den Paketmanager pacman. Dies dürfte Ihnen von Ihrem Artix-System sehr vertraut vorkommen.

1. Laden Sie MSYS2 herunter und installieren Sie es.
2. Öffnen Sie das MSYS2-Terminal und aktualisieren Sie das System wie gewohnt:

pacman -Syu

3. Sie können darüber zusätzliche Werkzeuge nachinstallieren, die Sie für Ihre Skripte benötigen (z. B. rsync, curl, python).
4. Direktaufruf aus Windows: Sie können MSYS2-Skripte auch direkt über eine Windows-Verknüpfung oder ein CMD-/PowerShell-Fenster triggern:

C:\msys64\usr\bin\bash.exe -lc "./mein_skript.sh"

[8, 9]

## Methode 3: Cygwin (Der traditionelle Weg)
Cygwin ist der Urvater der Linux-Kompatibilität unter Windows. Es bietet eine gigantische Sammlung von GNU- und Open-Source-Tools, die eine weitreichende Linux-API-Funktionalität direkt unter Windows emulieren. Es ist mächtig, allerdings im Vergleich zu Git Bash oder MSYS2 etwas träger und optisch altbacken.

## ⚠️ Stolpersteine beim Ausführen von Bash unter Windows
Da das Skript auf einem Windows-Kernel läuft, müssen Sie beim Schreiben von Skripten drei Dinge zwingend beachten: [10]

1. Zeilenumbrüche (CRLF vs. LF):
Windows nutzt am Zeilenende \r\n (CRLF), Linux nutzt \n (LF). Wenn Sie ein Bash-Skript mit einem Windows-Editor (wie Notepad) speichern, bricht die Bash mit Fehlermeldungen wie \r: command not found ab.
* Lösung: Stellen Sie Ihren Editor (z. B. VS Code) unten rechts manuell von CRLF auf LF um, bevor Sie speichern.
2. Pfad-Formate:
Windows nutzt C:\Ordner\Datei.txt. Bash versteht Backslashes jedoch als Escape-Zeichen.
* Lösung: In Git Bash oder MSYS2 müssen Sie Pfade im POSIX-Stil schreiben: /c/Users/Name/Documents/skript.sh. [6, 8]
3. Fehlende Systemnahe Linux-Befehle:
Befehle wie systemctl, iptables oder Zugriffe auf /proc und /sys funktionieren ohne echtes Linux (wie im WSL2) nicht, da darunter weiterhin der Windows-Kernel arbeitet. Reine Dateioperationen, String-Verarbeitungen oder API-Abfragen laufen hingegen tadellos.


[1] [https://www.youtube.com](https://www.youtube.com/watch?v=teI6WA48_Rg&t=3)
[2] [https://www.reddit.com](https://www.reddit.com/r/webdev/comments/1nis8bb/does_anyone_use_windows_without_wsl_for/?tl=de)
[3] [https://superuser.com](https://superuser.com/questions/1702421/how-to-set-wsl-shell-as-default-application-for-shell-scripts)
[4] [https://www.youtube.com](https://www.youtube.com/watch?v=yoZ910JQzrg)
[5] [https://www.youtube.com](https://www.youtube.com/watch?v=UdhAb0t5iHw&vl=de)
[6] [https://graphite.com](https://graphite.com/guides/change-directories-git-bash-windows)
[7] [https://www.youtube.com](https://www.youtube.com/watch?v=8Hil7Tx19FA&t=14)
[8] [https://stackoverflow.com](https://stackoverflow.com/questions/47438779/executing-a-script-in-msys2-mingw)
[9] [https://gist.github.com](https://gist.github.com/2a833f961ec3aa99403f7dbce6d31cb1)
[10] [https://www.reddit.com](https://www.reddit.com/r/wsl2/comments/1eb0ks7/running_a_bash_script_thats_on_a_windows_host/)
 
Caramon2 schrieb:
Bei mir passierte gar nichts:
Schau doch mal auf meinen Screenshot, du brauchst zwei Präfixe, die mit _ schließen, sonst funktioniert es nicht (oder du musst das im Script ändern). Ist jetzt aber auch egal.

# 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]}"
Ergänzung ()

Caramon2 schrieb:
Padde sagte mir nichts
englisch: to pad, deutsch: auffüllen oder ausstopfen (also 0en voranstellen)

Padde ist dann der Indikativ oder Imperativ.
 
Was hat das alles noch mit den Power toys zu tun?
 
  • Gefällt mir
Reaktionen: the_IT_Guy
Micha- schrieb:
Was hat das alles noch mit den Power toys zu tun?
Nichts!

Deshalb hatte ich schon am WE die Mods gebeten (inkl. Auflistung der betreffenden Beiträge) daraus einen eigenen Thread zu erstellen: "PowerShell- und Bash-Skripte" den ich dann weiter ausbauen wollte. (das hatte ich denen auch geschrieben)

Aber die erfinden lieber Ausreden, als etwas zu tun:
Leider wurde deine aktuelle Meldung abgelehnt: Beitrag im Thema 'News - Windows-Werkzeugkasten: PowerToys 0.100 bringt größtes Update seit Langem' - das ist etwas was du selbst tun kannst in einem von dur erstellten neuen thread mit allen die daran beteiligt sind. nur so passt der kontext um neuen thread da so jeder weiß worum es geht. deshalb im startpost alles erklären und dann die inhalte rein bringen.

Darauf ich:
Das stimmt doch überhaupt nicht: Im gemeldeten Beitrag erklärt Qualle erstmals worum es ihn geht und alle aneren genannten von mir und Qualle basieren darauf: Mit ihm ist das abgesprochen, andere haben sich nicht daran beteiligt und mit den Powertoys hat das überhaupt nichts zu tun, so dass es das relevant in dem neuen Theead zusammenfasst und der Powertoy-Thread übersichtlich wird: win-win.

Das nicht zu machen ist kontraproduktiv.

Erst gestern Abend die Antwort:
Leider wurde deine aktuelle Meldung abgelehnt: Beitrag im Thema 'News - Windows-Werkzeugkasten: PowerToys 0.100 bringt größtes Update seit Langem' - geht dennoch nicht weit genug um da einzugreifen. auch gehört es nicht zu den aufgaben der moderation gespräche in neue threads auseinanderzupflücken ;). wir versenken beiträge entweder komplett oder weisen die user auf andere wege und threads hin die thematik zu diskutieren.

Wozu ich eben geschrieben habe:
Beiträge wurden auf meine Bitte schon zweimal zu neuen Treads gemacht. - Die dann erfolgreich/hilfreich wurden.

Aber das hat sich inzwischen sowieso erledigt, da mir euer Verhalten (zum wiederholen Mal) den Spaß daran verdorben hat, mich weiter damit zu beschäftigen.

Mir kommt es so vor, als würdet ihr inzwischen mehr Zeit damit verschwenden, immer fadenscheiniger Ausreden zu erfinden, als es kosten würde, etwas für das Forum zu tun.

Btw:

Das hat übrigens nichts mit meinem Pro zu tun. Das habe ich nicht mal selbst bezahlt, sondern es wurde mir aufgrund dieses Beitrags von einem anderen User geschenkt: https://www.computerbase.de/forum/t...appell-und-unser-wunsch.2261460/post-31183909

Dabei hatte ich das dort geschrieben, um andere zu motivieren, dass es auch bei ihnen "Klick" macht.
 
@Caramon2 Mach doch bitte ein neues Thema unter Programmierung auf... Das würde es für alle einfacher machen. Meine Scripte sind außerdem nicht geschützt, das heißt, du darfst sie einfach in das neue Thema kopieren, und du/ich/alle könnten dann einmal schauen, was man noch verbessern oder generalisieren könnte.
 
Zurück
Oben