Program do zmiany nazwy wielu plików

Mam bardzo dużo plików które są tworzone z długą nazwą… Potrzebuję za pomocą jednego kliknięcia zmienić nazwę plików w folderze do max 15 znaków z zachowaniem dotychczasowej nazwy. np. mamy plik co ma 30 znaków program kasuje wszystkie znaki powyżej 15. Można to zrobić skryptem w cmd ? jeśli polecacie jakiś program to musi być darmowy dla zastosowań komercyjnych.

Czy ja wiem, tak na szybko, to może taki skrypt PowerShell.

Funkcja do wyboru katalogu

function Select-Folder {
Add-Type -AssemblyName System.Windows.Forms
$folderBrowser = New-Object System.Windows.Forms.FolderBrowserDialog
$result = $folderBrowser.ShowDialog()
if ($result -eq [System.Windows.Forms.DialogResult]::OK) {
return $folderBrowser.SelectedPath
} else {
Write-Host „Nie wybrano katalogu.”
exit
}
}

Wybór katalogu

$folderPath = Select-Folder

Sprawdzanie, czy wybrano katalog

if (-not $folderPath) {
Write-Host „Nie wybrano katalogu. Skrypt zostaje przerwany.”
exit
}

Pobieranie wszystkich plików w katalogu

$files = Get-ChildItem -Path $folderPath -File

Licznik do numerowania plików

$counter = 1

foreach ($file in $files) {
# Skracanie nazwy pliku do 15 znaków (bez rozszerzenia)
$baseName = $file.BaseName
if ($baseName.Length -gt 15) {
$baseName = $baseName.Substring(0, 15)
}

# Dodawanie numeru do nazwy pliku
$newName = "{0}_{1}{2}" -f $baseName, $counter, $file.Extension

# Pełna ścieżka nowego pliku
$newFullName = Join-Path -Path $folderPath -ChildPath $newName

# Zmienianie nazwy pliku
Rename-Item -Path $file.FullName -NewName $newFullName

# Zwiększanie licznika
$counter++

}

Write-Host „Zmieniono nazwy wszystkich plików w katalogu: $folderPath”

Instrukcja użycia skryptu:

  1. Skopiuj powyższy kod i wklej go do nowego pliku tekstowego.
  2. Zapisz plik z rozszerzeniem .ps1, np. ZmienNazwyPlikow.ps1.
  3. Otwórz PowerShell jako administrator.
  4. Przejdź do katalogu, w którym zapisałeś skrypt, używając polecenia cd.
  5. Uruchom skrypt, wpisując .\ZmienNazwyPlikow.ps1 i naciśnij Enter.
  6. Wybierz katalog, w którym chcesz zmienić nazwy plików, korzystając z okna dialogowego, które się pojawi.

Skrypt ten:

  • Umożliwia wybór katalogu za pomocą okna dialogowego.
  • Pobiera wszystkie pliki w wybranym katalogu.
  • Skraca nazwy plików do maksymalnie 15 znaków.
  • Dodaje numer do każdego pliku, aby nazwy były unikalne.
  • Zmienia nazwy plików w wybranym katalogu.

Nie testowałem, ale myślę, że powinno być ok. najwyżej jak będzie jakiś błąd daj znać, to poprawimy.
Tworząc skrypt posiłkowałem się ChatGPT, możesz za jego pomocą dokonać też modyfikacji pod swoje preferencje.

Total Commander ma coś takiego jak „Narzędzie wielokrotnej zmiany”

Total Commander jest niestety płatny do zastosowań komercyjnych…

ten skrypt coś nie działa… otwieram w powershell ale niestety… kopiuje do notatnika tylko to? czy coś więcej ?

foreach ($file in $files) {
$baseName = $file.BaseName
if ($baseName.Length -gt 15) {
$baseName = $baseName.Substring(0, 15)
}

function Select-Folder {
Add-Type -AssemblyName System.Windows.Forms
$folderBrowser = New-Object System.Windows.Forms.FolderBrowserDialog
$result = $folderBrowser.ShowDialog()
if ($result -eq [System.Windows.Forms.DialogResult]::OK) {
return $folderBrowser.SelectedPath
} else {
Write-Host „Nie wybrano katalogu.”
exit
}
}

Wybór katalogu

$folderPath = Select-Folder

Sprawdzanie, czy wybrano katalog

if (-not $folderPath) {
Write-Host „Nie wybrano katalogu. Skrypt zostaje przerwany.”
exit
}

Pobieranie wszystkich plików w katalogu

$files = Get-ChildItem -Path $folderPath -File

Licznik do numerowania plików

$counter = 1

foreach ($file in $files) {
# Skracanie nazwy pliku do 15 znaków (bez rozszerzenia)
$baseName = $file.BaseName
if ($baseName.Length -gt 15) {
$baseName = $baseName.Substring(0, 15)
}

# Dodawanie numeru do nazwy pliku
$newName = "{0}_{1}{2}" -f $baseName, $counter, $file.Extension

# Pełna ścieżka nowego pliku
$newFullName = Join-Path -Path $folderPath -ChildPath $newName

# Sprawdzanie, czy nowa nazwa już istnieje, jeśli tak, zwiększanie licznika
while (Test-Path -Path $newFullName) {
    $counter++
    $newName = "{0}_{1}{2}" -f $baseName, $counter, $file.Extension
    $newFullName = Join-Path -Path $folderPath -ChildPath $newName
}

# Zmienianie nazwy pliku
Rename-Item -Path $file.FullName -NewName $newFullName

# Zwiększanie licznika
$counter++

}

Write-Host „Zmieniono nazwy wszystkich plików w katalogu: $folderPath”

Zastąpiłem cudzysłowy łamane z Unicode na proste, aby uniknąć problemów z interpretacją w PowerShell.

Sprawdziłem, pozwala wybrać katalog i jeśli pliki mają dłuższe nazwy niż 15 to obcina i numeruje.

Dodać ci jeszcze wybór aby, można było sobie ustawić do ilu znaków ma skracać.

function Select-Folder {
Add-Type -AssemblyName System.Windows.Forms
$folderBrowser = New-Object System.Windows.Forms.FolderBrowserDialog
$result = $folderBrowser.ShowDialog()
if ($result -eq [System.Windows.Forms.DialogResult]::OK) {
return $folderBrowser.SelectedPath
} else {
Write-Host „Nie wybrano katalogu.”
exit
}
}

Wybór katalogu

$folderPath = Select-Folder

Sprawdzanie, czy wybrano katalog

if (-not $folderPath) {
Write-Host „Nie wybrano katalogu. Skrypt zostaje przerwany.”
exit
}

Pytanie o liczbę znaków do skracania nazw plików

[int]$maxLength = Read-Host „Podaj maksymalną liczbę znaków dla nazwy pliku”

Pobieranie wszystkich plików w katalogu

$files = Get-ChildItem -Path $folderPath -File

Licznik do numerowania plików

$counter = 1

foreach ($file in $files) {
# Skracanie nazwy pliku do podanej liczby znaków (bez rozszerzenia)
$baseName = $file.BaseName
if ($baseName.Length -gt $maxLength) {
$baseName = $baseName.Substring(0, $maxLength)
}

# Dodawanie numeru do nazwy pliku
$newName = "{0}_{1}{2}" -f $baseName, $counter, $file.Extension

# Pełna ścieżka nowego pliku
$newFullName = Join-Path -Path $folderPath -ChildPath $newName

# Sprawdzanie, czy nowa nazwa już istnieje, jeśli tak, zwiększanie licznika
while (Test-Path -Path $newFullName) {
    $counter++
    $newName = "{0}_{1}{2}" -f $baseName, $counter, $file.Extension
    $newFullName = Join-Path -Path $folderPath -ChildPath $newName
}

# Zmienianie nazwy pliku
Rename-Item -Path $file.FullName -NewName $newFullName

# Zwiększanie licznika
$counter++

}

Write-Host „Zmieniono nazwy wszystkich plików w katalogu: $folderPath”

Ok. teraz po wybraniu katalogu wpisujesz jeszcze do ilu znaków ma mieć nazwa. Nazwy są skracane, a następnie jest dodawana kreska i kolejny numer. Sprawdzane jest też czy plik o nowej nazwie już istnieje i jeśli tak, to zwiększa licznik, aby uniknąć nadpisania pliku. Sprawdziłem, działa. Wystarczy zapisać z w notatniku z rozszerzeniem .ps1 i wrzucić w PowerShell.

A tutaj link zrobiłem ci z tego program, żebyś nie musiał się mordować z PowerShell. :grinning:

Wszytko fajnie ale ten link coś nie działa:

a jak uruchamiam stworzony w notatniku skrypt w PowerShell to niestety mam takie coś:

może wrzucisz na inny dysk ten link.

link
Trzeba zmienić rozszerzenie z opr na exe.

Program działa na 100% sprawdziłem.
Skrypt wymaga PowerShell co najmniej 5.1 i NET Framework 4.5 lub nowszy.

kurczę pobrałem to ale niestety wykryło konia trojańskiego :smiley: i usunęło mi :smiley: to na pewno bezpieczne ? :smiley:

Tak. Skrypty PowerShell zamienione na program za pomocą WIN-PS2EXE są często wykrywane jako wirusy, bo potencjalnie można tak wirusa zrobić. Kod skryptu masz wyżej, więc widzisz co tam jest, sam sobie możesz skompilować z tego program, za pomocą win-ps2exe. Mam trochę narzędzi, które tak stworzyłem do różnych celów i na niektórych systemach też wykrywa jako szkodliwe oprogramowanie. W końcu VPN czy TeamViewer też jest tak czasami wykrywany.

PS. Swoją drogą McAfee to największy wirus :slight_smile:

Może serwis do udostępniania coś dodaje do pliku, zamieniłem na jpg i udostępniłem z google, zobaczymy czy zadziała. link

Ok działa. Powinno dać się pobrać. Google się pruje co prawda i Windows też za 1 razem, ale potem już jest ok.

Wystarczyło to otoczyć ``` od góry i od dołu:

# Funkcja do wyboru katalogu
function Select-Folder {
    Add-Type -AssemblyName System.Windows.Forms
    $folderBrowser = New-Object System.Windows.Forms.FolderBrowserDialog
    $result = $folderBrowser.ShowDialog()
    if ($result -eq [System.Windows.Forms.DialogResult]::OK) {
        return $folderBrowser.SelectedPath
    } else {
        Write-Host "Nie wybrano katalogu."
        exit
    }
}

# Wybór katalogu
$folderPath = Select-Folder

# Sprawdzanie, czy wybrano katalog
if (-not $folderPath) {
    Write-Host "Nie wybrano katalogu. Skrypt zostaje przerwany."
    exit
}

# Pobieranie wszystkich plików w katalogu
$files = Get-ChildItem -Path $folderPath -File

# Licznik do numerowania plików
$counter = 1

foreach ($file in $files) {
    # Skracanie nazwy pliku do 15 znaków (bez rozszerzenia)
    $baseName = $file.BaseName
    if ($baseName.Length -gt 15) {
        $baseName = $baseName.Substring(0, 15)
    }
    
    # Dodawanie numeru do nazwy pliku
    $newName = "{0}_{1}{2}" -f $baseName, $counter, $file.Extension
    
    # Pełna ścieżka nowego pliku
    $newFullName = Join-Path -Path $folderPath -ChildPath $newName
    
    # Zmienianie nazwy pliku
    Rename-Item -Path $file.FullName -NewName $newFullName

    # Zwiększanie licznika
    $counter++
}

Write-Host "Zmieniono nazwy wszystkich plików w katalogu: $folderPath"

I cudzysłowie działa poprawnie.

Być może AntRenamer ma licencję na komercję:

Nie tylko komercyjnych, domowych także ale 1 licencja wystarczy na wszystkie komputery w domu.
Można też to samo zrobić używając Unreal Commander - jest darmowy ale grzecznie prosi o niewielką dotację (można odmówić).

P.S. Sprawdziłem też Double Commander (Windows/Linux - całkowicie darmowy, licencja GNU GPL2 + źródła) - również tam jest narzędzie wielkokrotnej zmiany. Jedyny minus to to, że oba programy zostały napisane przez rosyjskich programistów.

Nie do końca:

W powershell. Przetestuj na jakimś folderze


PS C:\Users\user\Desktop\Nowy folder> dir


    Directory: C:\Users\user\Desktop\Nowy folder


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        14.05.2024     15:26            324 Nowy AutoHotkey Script.ahk
-a----        14.05.2024     15:26              0 Nowy Dokument tekstowy OpenDocument.odt
-a----        14.05.2024     15:26              0 Nowy Prezentacja OpenDocument.odp
-a----        14.05.2024     15:26              0 Nowy Rysunek OpenDocument.odg


PS C:\Users\user\Desktop\Nowy folder> Get-ChildItem | ForEach-Object { Rename-Item $_ -NewName ($_.Name.Substring(0, 15) + $_.Extension) }
PS C:\Users\user\Desktop\Nowy folder> dir


    Directory: C:\Users\user\Desktop\Nowy folder


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        14.05.2024     15:26            324 Nowy AutoHotkey.ahk
-a----        14.05.2024     15:26              0 Nowy Dokument t.odt
-a----        14.05.2024     15:26              0 Nowy Prezentacj.odp
-a----        14.05.2024     15:26              0 Nowy Rysunek Op.odg


PS C:\Users\user\Desktop\Nowy folder>

Wygenerowal Copilot.

Ten programik, który podałem działa bez problemu. Skrypt też działa.

program niestety nie jest darmowy dla zastosowań komercyjnych https://www.advancedrenamer.com/

mordowałem się trochę czasu z tym skryptem i okazało się że u mnie zablokowane jest otwieranie skryptów z PowerShell, nie chce tego odblokowywać bo spadnie poziom bezpieczeństwa ale dzięki za pomoc :slight_smile:

Przetestowałem ten Double Commander, działa identycznie jak Total Comander i jest nawet w wersji portable :slight_smile: dzięki