Переименовать все файлы в папке, используя пакет или PowerShell, запустить из пакета

У меня есть файлы случайных имен файлов и расширений в папке с другим случайным именем файла, которое содержит расширение *.htm. Я хочу переименовать все имена файлов каждого случайного файла в папке, чтобы они соответствовали одному файлу *.htm, сохраняя при этом правильное расширение для каждого случайного файла.

Таким образом, при запуске пакетного файла будет обнаружен файл, такой как "My File Name.HTM", и следующие файлы будут переименованы в:

  • "test.doc" переименован в "My File Name.doc"

  • "anyfile.jpg" переименован в "My File Name.jpg"

  • "text.txt" переименован в "My File Name.txt"

я пытался

Rename "*.*" "*.htm"

без успеха. Файл *.HTM может быть любым неизвестным именем файла, но всегда будет содержать расширение HTM, и это всегда будет единственный файл с расширением HTM в папке. Затем я запускаю командный файл из командной строки.

2 ответа

Краткий пакетный файл:

for %%f in (*.htm) do set name=%%~nf
ren * "%name%.*"

Те же предостережения, что и в ответе n01d. Кроме того, не помещайте свой командный файл в тот же каталог.

Редактировать:

Вот пример сеанса, показывающий, что пакетный файл переименовывает все файлы в имя файла.htm:

D:\tmp\kktmp>dir
 Volume in drive D has no label.
 Volume Serial Number is 4EDE-41E1

 Directory of D:\tmp\kktmp

14/07/2016  12:06    <DIR>          .
14/07/2016  12:06    <DIR>          ..
14/07/2016  12:05                 0 Author Name - Book Title - The Billionaires Revenge.htm
14/07/2016  12:06                 0 Book Title - The Billiona - Author Name.azw3
14/07/2016  12:06                 0 Book Title - The Billiona - Author Name.epub
14/07/2016  12:06                 0 Book Title - The Billiona - Author Name.mobi
14/07/2016  12:06                 0 Book Title - The Billiona - Author Name.pdf
               5 File(s)              0 bytes
               2 Dir(s)  52,725,227,520 bytes free

D:\tmp\kktmp>type ..\t.bat
for %%f in (*.htm) do set name=%%~nf
ren * "%name%.*"

D:\tmp\kktmp>..\t.bat

D:\tmp\kktmp>for %f in (*.htm) do set name=%~nf

D:\tmp\kktmp>set name=Author Name - Book Title - The Billionaires Revenge

D:\tmp\kktmp>ren * "Author Name - Book Title - The Billionaires Revenge.*"

D:\tmp\kktmp>dir
 Volume in drive D has no label.
 Volume Serial Number is 4EDE-41E1

 Directory of D:\tmp\kktmp

14/07/2016  12:37    <DIR>          .
14/07/2016  12:37    <DIR>          ..
14/07/2016  12:06                 0 Author Name - Book Title - The Billionaires Revenge.azw3
14/07/2016  12:06                 0 Author Name - Book Title - The Billionaires Revenge.epub
14/07/2016  12:05                 0 Author Name - Book Title - The Billionaires Revenge.htm
14/07/2016  12:06                 0 Author Name - Book Title - The Billionaires Revenge.mobi
14/07/2016  12:06                 0 Author Name - Book Title - The Billionaires Revenge.pdf
               5 File(s)              0 bytes
               2 Dir(s)  52,724,703,232 bytes free

Что-то вроде этого:

$files = Get-ChildItem -Path D:\TEST_123
$htmBaseName = $files | where {$_.Extension -eq '.htm'} | select -ExpandProperty BaseName

foreach ($f in $files) {
    if ($f.Extension -ne '.htm') {
        Rename-Item -Path $f.FullName -NewName ($htmFileName + $f.Extension)
    }
}

Но будьте осторожны: если существует более одного файла с одним и тем же доп. вы получите ошибку Cannot create a file when that file already exists,

Другие вопросы по тегам