Forum: PC-Programmierung letzte Buchstabe von Ordnernamen entfernen mit Skript


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Owen S. (senmeis)


Lesenswert?

Servus,

mit dem folgenden Windows Skript will man die letzte Buchstabe von 
Ordnernamen entfernen. Problem: mehrere Buchstaben werden entfernt 
stattdessen. Woran liegt das?
1
@echo off
2
setlocal disabledelayedexpansion
3
4
for /d %%f in (*) do (
5
    set "foldername=%%f"
6
    set "basename=%%~nf"
7
    call :ProcessFile
8
)
9
echo Done!
10
pause
11
exit /b
12
13
:ProcessFile
14
set "newname=%basename:~0,-1%"
15
ren "%foldername%" "%newname%"
16
exit /b
von Heinz R. (heijz)


Lesenswert?

zeig mal ein vorher-nachher-Beispiel solch eines Ordnernamens?
von T.M .. (max)


Lesenswert?

1
@echo off
2
setlocal disabledelayedexpansion
3
4
:: Erst alle Namen in eine Temp-Datei sammeln
5
set "tmpfile=%TEMP%\folders.txt"
6
for /d %%f in (*) do echo %%f>>"%tmpfile%"
7
8
:: Dann aus der Datei lesen und umbenennen
9
for /f "usebackq delims=" %%f in ("%tmpfile%") do (
10
    set "foldername=%%f"
11
    set "basename=%%~nf"
12
    call :ProcessFile
13
)
14
15
del "%tmpfile%"
16
echo Done!
17
pause
18
exit /b
19
20
:ProcessFile
21
set "newname=%basename:~0,-1%"
22
ren "%foldername%" "%newname%"
23
exit /b
von Speedy G. (Firma: ACME) (speedy-g)


Lesenswert?

1
@echo off
2
setlocal enabledelayedexpansion
3
4
:: Loop through every folder in the current directory
5
for /d %%f in (*) do (
6
    set "foldername=%%f"
7
    
8
    :: Slice the name: Start at index 0, stop 1 character from the end
9
    set "newname=!foldername:~0,-1!"
10
11
    :: Only rename if the new name isn't empty
12
    if not "!newname!"=="" (
13
        echo Renaming "%%f" -> "!newname!"
14
        ren "%%f" "!newname!"
15
    ) else (
16
        echo Skipping "%%f" (Name too short to trim)
17
    )
18
)
19
20
echo.
21
echo Process Complete!
: Bearbeitet durch User
von Jens M. (schuchkleisser)


Lesenswert?

Ich würd einfach "Advanced Renamer" benutzen, das kann solche Sachen mit 
Links und man kann vorher sehen ob das Ergebnis stimmt.

Gibt's bei https://www.advancedrenamer.com/lang/de/
: Bearbeitet durch User
von Rüdiger B. (rbruns)


Lesenswert?

von Hans (ths23)


Lesenswert?

Jens M. schrieb:
> Ich würd einfach "Advanced Renamer" benutzen, das kann solche Sachen mit
> Links und man kann vorher sehen ob das Ergebnis stimmt.
Oder mit dem Totalcommander, der kann das auch und zeigt ebenfalls das 
Ergebnis vorab an.
von Owen S. (senmeis)


Lesenswert?

Leider geht beides schief. Beispiel:

Vorher:
Various.Artists.-.Living.Stereo.Sampler!]
Nachher:
Various.Artists.-.Living.Stereo.Sampler!

Das Problem ist der Ordnername enthält Sonderzeichen wie z.B. Punkte.
von Heinz R. (heijz)


Lesenswert?

chatgpt sagt:


[code]
%%~nf does not mean “entire folder name.” It means only the name part 
before the last dot.

Vorschlag dort:

@echo off
setlocal DisableDelayedExpansion

for /d %%f in (*) do (
    set "foldername=%%f"
    call :ProcessFolder
)

echo Done!
pause
exit /b

:ProcessFolder
set "newname=%foldername:~0,-1%"

if "%newname%"=="" exit /b
if exist "%newname%" exit /b

echo Renaming "%foldername%" to "%newname%"
ren "%foldername%" "%newname%"
exit /b
[code]
: Bearbeitet durch User
von Rolf (rolf22)


Lesenswert?

Owen S. schrieb:
> Woran liegt das?

Das liegt an deinem Programmierfehler.

In einer Schleife des Typs "for each X in Y" darf man natürlich Y nicht 
verändern, wenn das Ergebnis nicht undefiniert sein soll.
von Jens M. (schuchkleisser)


Lesenswert?

Owen S. schrieb:
> Leider geht beides schief.

Advanced Renamer kann auch gleich die Punkte ersetzen, Leerzeichen oder 
Bindestriche einbauen oder entfernen, den dämlichen Warez-Namen richtig 
machen nach den Tags, oder die Tags auf den dämlichen Warez-Namen 
setzen, ganz wie es dir beliebt, alles in einem Rutsch.

Es gibt Sachen die man mit einem Batchscript schnell mal eben machen 
kann, und es gibt Ding die spezialisierte Tools besser können.
Dieses Vorhaben gehört zu den letzteren.
von Alexander (alecxs)


Lesenswert?

Nur eine Vermutung (hab mir dein Batchskript nicht angesehen) Ordner 
werden möglicherweise mehrfach prozessiert, da jeder umbenannte Ordner 
als neuer Ordner behandelt wird?
von Fred F. (fred08151)


Lesenswert?

@echo off
setlocal enabledelayedexpansion

for /d %%A in (*) do (
    set "name=%%A"

    rem Zeichen am Ende entfernen ...
    :strip_nonletters
    set "last=!name:~-1!"
    echo !last! | findstr /R "^[A-Za-z]$" >nul
    if errorlevel 1 (
        set "name=!name:~0,-1!"
        goto strip_nonletters
    )

    rem letzten Buchstaben entfernen ...
    set "new=!name:~0,-1!"

    echo Benenne "%%A" in "!neu!"
    ren "%%A" "!neu!"
)

echo Fertig.
pause
von Εrnst B. (ernst)


Lesenswert?

Owen S. schrieb:
> Windows Skript

Sollte das nicht inzwischen "Power Shell" sein, und nicht das alte 
DOS.BAT?
1
Get-ChildItem -Directory | ForEach-Object {
2
    $oldName = $_.Name
3
    
4
    # Beliebig Regex auf den Ordnernamen anwenden.
5
    # ggfs 'äöüÄÖÜß0-9' in der Regexp ergänzen.
6
    $newName = $oldName -replace '[^a-zA-Z]+$', '' -replace '.$', '' -replace '[ .-_]$', ''
7
8
    # Ganz wilde Input-Ordnernamen könnten von der regex auf '' reduziert werden...
9
    if ($newName) {
10
        Write-Host "Benenne '$oldName' in '$newName' um"
11
        Rename-Item -Path $_.FullName -NewName $newName
12
    }
13
}
14
15
Write-Host "Fertig."
16
Pause
: Bearbeitet durch User
von Daniel A. (daniel-a)


Lesenswert?

Unter Linux mit einem Bash Script ist das alles ganz einfach:
1
shopt -s nullglob
2
for file in */; do
3
  mv -vnT "$file" "${file::-2}"
4
done
von Alexander (alecxs)


Lesenswert?

Damit wollen wir jetzt nicht anfangen. Der nächste kommt dann mit Python 
an.
von Owen S. (senmeis)


Lesenswert?

Danke. Das klappt mit dem Code von Heinz R.

Nun möchte ich stattdessen Dateinamen ändern. Skript:
1
REM erste 25 Zeichen wegmachen
2
@echo off
3
for /R "%~dp0" %%f in (*.txt) do (
4
    setlocal disabledelayedexpansion
5
    set "name=%%f" 
6
    setlocal enabledelayedexpansion
7
    ren "!name!" "!name:~25!" 2>nul
8
    endlocal
9
    endlocal
10
)
11
echo Done.
Also vorher:
V.A.-.[RCA.LIVING.STEREO.Munch.-.A.Hi-fi.Spectacular!.txt

Nachher:
Munch.-.A.Hi-fi.Spectacular!.txt

Das Problem ist „ren“ passiert einfach nicht. Der angegebene Dateiname 
lautet: F:\test\Munch.-.A.Hi-fi.Spectacular!\ 
V.A.-.[RCA.LIVING.STEREO.Munch.-.A.Hi-fi.Spectacular!.txt

Ist das ein Muß, „ren“ ohne Ordner zu machen?
von Walter T. (nicolas)


Lesenswert?

Vielleicht bist Du mit den PowerToys besser aufgehoben? Da ist auch ein 
Renamer dabei, der reguläre Ausdrücke unterstützt.
von Jens M. (schuchkleisser)


Lesenswert?

Masochist? Oder geht's um's Prinzip, das so unbequem, kompliziert, 
umständlich und Fehleranfällig wie möglich zu machen?

Was "ren" kann, könnte dir ein "ren /?" sagen...
von Norbert (der_norbert)


Lesenswert?

Owen S. schrieb:
> Nun möchte ich stattdessen Dateinamen ändern.

Lässt du dir gerade von den Forenteilnehmern einen Satz Scripts bauen?
Wie viele sollen's denn werden?

Wie wäre es stattdessen mit Lesen der Doku. bzw. der eingebauten Hilfe?
von Operator S. (smkr)


Lesenswert?

Norbert schrieb:
> Lässt du dir gerade von den Forenteilnehmern einen Satz Scripts bauen?

Das ist ja wie KI verwenden, nur rückwärts
von Frank D. (Firma: LAPD) (frank_s634)


Lesenswert?

Daniel A. schrieb:
> Unter Linux mit einem Bash Script ist das alles ganz einfach:shopt
> -s nullglob
> for file in */; do
>   mv -vnT "$file" "${file::-2}"
> done
Wenn schon Perl drauf ist auch rename ( link auf file-rename, je nachdem 
was unter /etc/alternatives eingestellt ist) drauf, das kann regexp. Für 
das dir-only-handling braucht man dann allerdings doch noch die 
Schleife, das kann man aber auf der Konsole zusammen mit rename in 
einer zeile reinhauen, hier im Testmodus, das zeigt nur die Änderung, 
nimmt sie aber nicht vor:
1
for d in */; do rename -n 's/^(.*)(.)$/$1/' "$d"; done

Wenn es alles so ist wie es sein soll entfernt man den -n Schalter.
: Bearbeitet durch User
von Heinz R. (heijz)


Lesenswert?

Owen S. schrieb:
> Danke. Das klappt mit dem Code von Heinz R.

ich habe da zugegeben keine Ahnung von - aber nutze für so was echt oft 
ChatGPT, bin ein Freund davon, neue Möglichkeiten testen und nutzen

Hatte es einfach mal aus Neugierde dort eingetippt

Aber ja, ich weiss, viele Hasser von KI hier
von Jens M. (schuchkleisser)


Lesenswert?

Wenn du nicht kontrollieren kannst was GPT dir vorschlägt, ist es 
reichlich gefährlich die Programme zu nutzen die es ausspuckt.
Mit Glpck tun sie was sie sollen, meist tun sie einfach nix, oder eben 
sie gehen total in die Tonne und löschen irgendwas was nicht gelöscht 
werdne sollte.
von Heinz R. (heijz)


Lesenswert?

Jens M. schrieb:
> Wenn du nicht kontrollieren kannst was GPT dir vorschlägt, ist es
> reichlich gefährlich die Programme zu nutzen die es ausspuckt.
> Mit Glpck tun sie was sie sollen, meist tun sie einfach nix, oder eben
> sie gehen total in die Tonne und löschen irgendwas was nicht gelöscht
> werdne sollte.

oh man - was soll ich sagen

das waren ein paar Zeilen Code - mit ein paar wenigen Hirnzellen kann 
man das vorher testen

Aber wenn Du auch nicht weisst ob die Tauchsäge wirklich das Holz sägt, 
oder Dir evtl. die Finger abschnibbelt, lass besser generell die Finger 
von solchen Sachen
von Jens M. (schuchkleisser)


Lesenswert?

Wenn du das so einfach kontrollieren kannst, kannst du es auch ohne GPT 
schreiben.
von Heinz R. (heijz)


Lesenswert?

Jens M. schrieb:
> Wenn du das so einfach kontrollieren kannst, kannst du es auch ohne GPT
> schreiben.

nein, genau das kann ich zugegeben nicht - hier noch eine eckige 
Klammer, dort eine Runde,.....
von Frank D. (Firma: LAPD) (frank_s634)


Lesenswert?

Heinz R. schrieb:
> das waren ein paar Zeilen Code - mit ein paar wenigen Hirnzellen kann
> man das vorher testen

Glaube ich nicht, sonst hättest du so ein Trivialprogramm auch selber 
hinbekommen.
von Heinz R. (heijz)


Lesenswert?

Frank D. schrieb:
> Glaube ich nicht, sonst hättest du so ein Trivialprogramm auch selber
> hinbekommen.

wenn es so trivial für Dich ist - warum hast es hier nicht gepostet?

Verstehe, zu faul
Aber dann wieder nicht zu faul hier dumme Kommentare abzugebem
von Ralf D. (doeblitz)


Lesenswert?

Heinz R. schrieb:
> Jens M. schrieb:
>> Wenn du das so einfach kontrollieren kannst, kannst du es auch ohne GPT
>> schreiben.
>
> nein, genau das kann ich zugegeben nicht - hier noch eine eckige
> Klammer, dort eine Runde,.....

Wer die Syntax schon nicht beherrscht, der wird die korrekte Semantik 
schon gar nicht überprüfen können.

Deshalb halte ich von Vibe-Coding auch maximalen Abstand.
von Heinz R. (heijz)


Lesenswert?

mir reicht es das Ergebnis zu kontrollieren

aber schön für Dich das Du alles selber kannst, selbst Herz-OPs werden 
wahrscheinlich daheim gemacht....

Oder vielleicht auch das Gegenteil - der eifrige Coder der sonst von 
nichts Ahnung hat, für alles Handwerker braucht und jetzt Angst hat das 
ihm die KI bald die Butter vom Brot nimmt?
von Frank D. (Firma: LAPD) (frank_s634)


Lesenswert?

Heinz R. schrieb:
> wenn es so trivial für Dich ist - warum hast es hier nicht gepostet?
Weil ich schon ne Alternative gepostet habe, da ich den Windowsbatchmüll 
schon lange nicht mehr verwende wie eigentlich jeder der nicht in den 
80ern hängen geblieben ist.

> Verstehe, zu faul
> Aber dann wieder nicht zu faul hier dumme Kommentare abzugebem
Zum Glück haben wir ja dich, den freundlichen Helfer der ChatGPT 
bedienen kann.
von Heinz R. (heijz)


Lesenswert?

Frank D. schrieb:
> Zum Glück haben wir ja dich, den freundlichen Helfer der ChatGPT
> bedienen kann.

Tja, der eine hats, der andere nötig :-)

Aber ich hatte das Gleiche vor 20 Jahren, Kollegen haben gesagt - hey, 
Du kannst doch Google bedienen, kannst mir mal helfen?
von Oliver S. (oliverso)


Lesenswert?

Heinz R. schrieb:
> Aber ich hatte das Gleiche vor 20 Jahren, Kollegen haben gesagt - hey,
> Du kannst doch Google bedienen, kannst mir mal helfen?

Nicht alles, was hinkt, ist ein Vergleich. Ich sag mal, die Kompetenz 
„ich kann ChatGPT bedienen“ kommt gleich nach „ich kann den Fernseher 
alleine einschalten“.

Oliver
von Alexander (alecxs)


Lesenswert?

Würde ich so nicht unterschreiben. Prompten will gelernt sein.

https://www.mikrocontroller.net/topic/goto_post/8037601
von Oliver S. (oliverso)


Lesenswert?

Alexander schrieb:
> Würde ich so nicht unterschreiben. Prompten will gelernt sein.

Natürlich. Nur liefert ChatGPT aber unverdrossen Antworten, egal, ob der 
Mensch vor dem Bildschirm nun Ahnung hat, oder nicht. Da kommt’s dann 
schnell zu persönlichen Überschätzungen.

Oliver
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.