У меня есть структура каталогов, как показано ниже:
Folder
> FileName1.abc
> Filename2.abc
> .............
Folder2
> FileName11.abc
> Filename12.abc
> ..............
> ..........
и т.д. У меня есть команда, которая может добавлять имена папок к именам файлов.
Образец:
Folder1_Filename1.abc
Folder1_Filename2.abc
Я хочу изменить это следующим образом.
Сделать имя папки таким же, как имена файлов:
Folder1.abc
Folder1 (1).abc
Folder2.xyz
Folder2 (1).xyz
Т.е. В результате я хочу заменить имена файлов на имя папки. Если есть файлы с разными именами с одинаковым расширением, они могут добавить (1), (2) в конец имен.
Сценарий:
@echo off
pushd "Folder"
for /d %%D in (*) do (
pushd "%%D"
for /r %%F in (*) do (
for %%P in ("%%F\..") do (
ren "%%F" "%%~nxP_%%~nxF"
)
)
popd
)
popd
Приведенная выше команда не делает того, что я хочу.
Эта команда просто добавляет имя папки в начало имен файлов.
PS: Я изменил команду "%%~nxP_%%~nxF"
на "%%~nxP%%~xF"
command.
И я почти выполнил то, что хотел.
Но в один момент я увидел, что только 1 из файлов с одинаковым расширением изменил свое имя.
Я искал команду, которая может добавить (1), (2), (3) при сохранении имен файлов с одинаковым расширением; но я не смог найти ее.
Подробный пример:
Folder
> Folder.jpg
> Folder (1).jpg
> Folder (2).jpg
> .............
Я буду благодарен, если вы знаете команду, которая может сделать то, что я хочу, кроме вышеупомянутой команды.
Вы заслуживаете благодарности.
В опубликованном коде операторы Rename-Item включают параметр -WhatIf
, поэтому его можно смело запускать для получения образцовых результатов, но не для реального выполнения действия. Если примерный результат является желаемым, удалите параметр -WhatIf
из обоих операторов Rename-Item
и запустите код заново.
Для нескольких файлов с одинаковым расширением код упрощается добавлением числовых суффиксов ко всем файлам, начиная нумерацию с 0
. Это позволяет применить одно утверждение/шаблон ко всем файлам.
Перед выполнением отредактируйте оператор $TopFolder
assignemnt, чтобы он отражал действительный путь.
$TopFolder = '<Path to "Folder">'
Get-ChildItem $TopFolder -Directory | ForEach-Object{
Get-ChildItem $_.FullName -File | Group-Object Extension | ForEach-Object{
If ( $_.Count -eq 1 )
{
$_.Group[0] | Rename-Item -NewName { $_.Directory.Name + $_.Extension} -WhatIf
}
Else
{
$NameTemplate = $_.Group[0].Directory.Name + ' ({0})' + $_.Name
For ( $i = 0 ; $i -lt $_.Count ; $i++ ) {
$_.Group[$i] | Rename-Item -NewName ( $NameTemplate -f $i ) -WhatIf
}
}
}
}
ForEach-Object
For Loop
Группа-объект
-f Оператор формата