letzte Buchstabe von Ordnernamen entfernen mit Skript

#8036375
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
#8036417
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
(Firma: ACME) #8036428
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
#8036784
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
#8036944
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.

#8037071
Lesenswert?

@echo off setlocal enabledelayedexpansion

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

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

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

13
echo Benenne "%%A" in "!neu!"
14
ren "%%A" "!neu!"

)

echo Fertig. pause

#8037098
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
#8037223
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?

(Firma: LAPD) #8037420
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
#8037442
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

#8037989
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.

#8038027
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?

(Firma: LAPD) #8038230
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren