Chciałbym zbiorczo zmieniać nazwy plików w folderze, dodając przedrostek nazwy folderu do nowych nazw. tzn. wszystkie pliki C:\house chores\
zostaną zmienione house chores - $old_name
.
Chciałbym zbiorczo zmieniać nazwy plików w folderze, dodając przedrostek nazwy folderu do nowych nazw. tzn. wszystkie pliki C:\house chores\
zostaną zmienione house chores - $old_name
.
Odpowiedzi:
Opcja 1: Korzystanie z programu Windows PowerShell
Otwórz menu systemu Windows. Wpisz: „PowerShell” i otwórz okno poleceń „Windows PowerShell”.
Idź do folderu z żądanymi plikami: np. Cd "C: \ prace domowe" Uwaga: adres musi zawierać cudzysłowy "", jeśli są spacje.
Możesz użyć „dir”, aby zobaczyć wszystkie pliki w folderze. Używanie „|” potokuje wyjście 'dir' dla następującego polecenia.
Uwagi: „dir” jest aliasem „Get-ChildItem”. Zobacz: wiki: cmdlets . Można zapewnić dodatkową funkcjonalność. np. „dir -recurse” wyświetla wszystkie pliki, foldery i podfoldery.
A jeśli chcę tylko zakresu plików?
Zamiast „dir |” Mogę użyć:
dir | where-object -filterscript {($_.Name -ge 'DSC_20') -and ($_.Name -le 'DSC_31')} |
W przypadku partii zmiany nazwy z nazwą katalogu jako przedrostkiem:
dir | Rename-Item -NewName {$_.Directory.Name + " - " + $_.Name}
Opcja 2: Korzystanie z wiersza polecenia
W folderze naciśnij shift + prawy przycisk myszy: wybierz „otwórz tutaj okno poleceń”
for %a in (*.*) do ren "%a" "prefix - %a"
Jeśli jest dużo plików, dobrze byłoby dodać przed tym polecenie „@echo off” i na końcu polecenie „echo on”.
do
) nie działa - po zmianie nazwy niektórych plików for
znajduje je pod nową nazwą, dodając raz po raz prefiks, aż do osiągnięcia limitu długości nazwy pliku.
ren was unexpected at this time.
pojęcie, dlaczego?
do
jego odpowiedzi brakuje słowa . powinno byćfor %a in (.) do ren "%a" "prefix - %a"
Problem z dwiema odpowiedziami Powershell polega na tym, że prefiks może zostać zduplikowany, ponieważ skrypt potencjalnie uruchomi plik zarówno przed, jak i po zmianie nazwy, w zależności od katalogu, który jest używany podczas procesu zmiany nazwy. Aby to obejść, po prostu użyj -Exclude
opcji:
Get-ChildItem -Exclude "house chores-*" | rename-item -NewName { "house chores-" + $_.Name }
Zapobiegnie to wielokrotnej zmianie nazwy jednego pliku przez proces.
Wolne oprogramowanie „ Narzędzie zbiorczej zmiany nazwy ” również działa dobrze (i jest potężne również w przypadku zaawansowanych zadań). Pobieranie i instalacja zajmuje minutę.
Zobacz zrzuty ekranu i samouczek na oryginalnej stronie internetowej.
-
Nie mogę dostarczyć zrzutów ekranu krok po kroku, ponieważ obrazy będą musiały zostać udostępnione na licencji Creative Commons , a nie jestem właścicielem zrzutów ekranu oprogramowania.
Zrzeczenie się: nie jestem w żaden sposób powiązany z tym oprogramowaniem / firmą. Produkt spodobał mi się do własnego zadania, spełnia wymagania OP i tym podobne, więc polecam.
To zadziałało dla mnie, najpierw cd w katalogu, w którym chcesz zmienić nazwy plików, a następnie uruchom następujące polecenie:
Get-ChildItem | rename-item -NewName { "house chores-" + $_.Name }
Wyrywałem sobie włosy, ponieważ w przypadku niektórych pozycji nazwa elementu o zmienionej nazwie byłaby ponownie zmieniana (wielokrotnie, chyba że została osiągnięta maksymalna długość nazwy pliku). Działo się to zarówno w przypadku Get-ChildItem, jak i przesyłania danych wyjściowych dir. Wydaje mi się, że pliki o zmienionych nazwach zostały przejęte z powodu zmiany kolejności alfabetycznej. Rozwiązałem ten problem w następujący sposób:
Get-ChildItem -Path . -OutVariable dirs
foreach ($i in $dirs) { Rename-Item $i.name ("<MY_PREFIX>"+$i.name) }
To „blokuje” wyniki zwrócone przez Get-ChildItem w zmiennej $ dirs i można je iterować bez obawy, że zmieni się kolejność lub wydarzy się inny zabawny biznes.
Wskazówka Dave.Gugga dotycząca używania -Exclude również powinna rozwiązać ten problem, ale to jest inne podejście; być może jeśli zmieniane nazwy plików zawierają już wzorzec użyty w przedrostku.
(Zastrzeżenie: jestem bardzo PowerShell n00b.)
Opierając się na odpowiedzi @ ofer.sheffer, jest to wariant CMD do dodawania afiksu (to nie jest pytanie, ale ta strona jest nadal numerem 1 w wynikach Google, jeśli szukasz przyrostka). Ze względu na rozszerzenie jest trochę inaczej.
for %a in (*.*) do ren "%~a" "%~na-affix%~xa"
Możesz zmienić część „-affix”.
Wiem, że to stare pytanie, ale wiele się nauczyłem z różnych odpowiedzi, ale wymyśliłem własne rozwiązanie jako funkcję. Powinno to dynamicznie dodać folder nadrzędny jako przedrostek do wszystkich plików pasujących do określonego wzorca, ale tylko wtedy, gdy nie ma już tego przedrostka.
function Add-DirectoryPrefix($pattern) {
# To debug, replace the Rename-Item with Select-Object
Get-ChildItem -Path .\* -Filter $pattern -Recurse |
Where-Object {$_.Name -notlike ($_.Directory.Name + '*')} |
Rename-Item -NewName {$_.Directory.Name + '-' + $_.Name}
# Select-Object -Property Directory,Name,@{Name = 'NewName'; Expression= {$_.Directory.Name + '-' + $_.Name}}
}
https://gist.github.com/kmpm/4f94e46e569ae0a4e688581231fa9e00
@
w@echo on
nie jest wymagane. Właśnie się odwróciłeś@echo off
.