Показать полную графическую версию : [решено] Переименование файлов
shraybikus
27-02-2020, 12:09
Добрый день! Помогите, пожалуйста, реализовать следующее:
Есть некий каталог с файлами. Нужно их переименовать согласно списку, который содержится в текстовом файле:
строка 1 - текущее имя файла 1
строка 2 - новое имя файла 1
строка 3 - текущее имя файла 2
строка 4 - новое имя файла 2
и т.д.
Затык в чтении второго параметра (во что переименовывать) для команды ren.
DJ Mogarych
27-02-2020, 14:39
shraybikus, пример файла приведите, есть ли там пути, расширения и т. д.
shraybikus
27-02-2020, 14:48
Пример файла:
14117
Приложение № 1.pdf
08278
Приложение № 2.xlsx
32545
Приложение № 3.docx
29721
Приложение № 4.docx
32730
Приложение № 5.docx
00142
Приложение № 6.docx
Каталог, имена в котором надо "восстановить":
00142
08278
14117
22
29721
32545
32730
for /f "tokens=1-2" %%A in (не_помню_как_файл_указывать_в_качестве_источника,_вроде_просто_без_кавычек?) do (
echo ren %%A %%B
)
cmd под рукой нет, виртуалку ради этого ставить лень. плюс-минус должно как-то так заработать. если я еще синтаксис cmd не забыл.
а не удобнее имя против имени писать? ну этж убицца можно такой файл читать. кмк если строка имеет вид "старое имя" "новое имя" - гораздо удобнее.
DJ Mogarych
27-02-2020, 14:59
Powershell:
$path = 'd:\temp'
$file = gc "$path\test.txt"
$counter = 1
$file |% {
if ($counter % 2 -eq 1) {[array]$oldName += $_}
else {[array]$newName += $_}
$counter++
}
$counter = 0
$oldname |% {
Rename-Item (get-item "$path\$_") -NewName $newName[$counter]
$counter++
}
shraybikus
27-02-2020, 14:59
должно как-то так заработать »
Я сделал пока вместо ren команду echo и получилось вот что:
14117
Приложение №
08278
Приложение №
32545
Приложение №
29721
Приложение №
32730
Приложение №
00142
Приложение №
Для продолжения нажмите любую клавишу . . .
Не взлетело. :(
Можно и в одну строку, но в именах файла есть пробелы, как быть с ними?
Powershell: »
Если говорить о powershell, то для данной задачи проще использовать возможности get-content:
gc file.txt -r 2 |%{$_[0] + " ~ " + $_[1]}
shraybikus
27-02-2020, 15:38
Если бы мне нужно было решение на ps, то я бы и поместил свой вопрос в соответствующий раздел.
Нужно именно CMD/BAT.
Такая конструкция тоже не работает:
@echo off
setlocal enableextensions enabledelayedexpansion
set sSourceFolder=1
for /f "tokens=1-2 delims=" %%a in (list) do (
echo %%a "b=" %%b
)
pause
exit /b
14117 "b="
Приложение № 1.pdf "b="
08278 "b="
Приложение № 2.xlsx "b="
32545 "b="
Приложение № 3.docx "b="
29721 "b="
Приложение № 4.docx "b="
32730 "b="
Приложение № 5.docx "b="
00142 "b="
Приложение № 6.docx "b="
Для продолжения нажмите любую клавишу . . .
Цикл выполняется дважды, и в переменную b похоже ничего не передается.
это потому что для cmd пробел это тоже разделитель. можно попробовать вот так если названия каждое в своей строке:
for /f "tokens=1-2 delims=" %%A in (всё_ещё_не_помню_как_файл_указывать_в_качестве_источника,_вроде_просто_без_кавычек?) do (
echo ren %%A %%B
)
или если названия в строку и, например, через подчеркивания записаны то:
for /f "tokens=1-2 delims=_" %%A in (всё_ещё_не_помню_как_файл_указывать_в_качестве_источника,_вроде_просто_без_кавычек?) do (
echo ren %%A %%B
)
14117_Приложение № 1.pdf
08278_Приложение № 2.xlsx
32545_Приложение № 3.docx
29721_Приложение № 4.docx
32730_Приложение № 5.docx
00142_Приложение № 6.docx
Я сделал пока вместо ren команду echo и получилось вот что: »
а это шикарно. я вообще-то перед ren - echo написал не просто так.;)
shraybikus
27-02-2020, 15:50
можно попробовать вот так если названия каждое в своей строке: »
Как я выше писал, не прёт. В переменную В не передаётся значение следующей строки, в итоге цикл выполняется только по А
@echo off
setlocal enableextensions enabledelayedexpansion
set sSourceFolder=1
for /f "tokens=1-2 delims=" %%A in (list) do (
echo "A=" %%A "B=" %%B
)
pause
exit /b
"A=" 14117 "B="
"A=" Приложение № 1.pdf "B="
"A=" 08278 "B="
"A=" Приложение № 2.xlsx "B="
"A=" 32545 "B="
"A=" Приложение № 3.docx "B="
"A=" 29721 "B="
"A=" Приложение № 4.docx "B="
"A=" 32730 "B="
"A=" Приложение № 5.docx "B="
"A=" 00142 "B="
"A=" Приложение № 6.docx "B="
Для продолжения нажмите любую клавишу . . .
а это шикарно. я вообще-то перед ren - echo написал не просто так. »
Не знаю, что тут шикарного, но оно не прёт в любом варианте:
ren 14117
ren Приложение № 1.pdf
ren 08278
ren Приложение № 2.xlsx
ren 32545
ren Приложение № 3.docx
ren 29721
ren Приложение № 4.docx
ren 32730
ren Приложение № 5.docx
ren 00142
ren Приложение № 6.docx
Для продолжения нажмите любую клавишу . . .
цикл выполняется только по А »
что по второму варианту? тот который
Код: Выделить весь код
for /f "tokens=1-2 delims=_" %%A in (file) do (
echo ren %%A %%B
)
и для которого нужны пары имен в одну строку через подчеркивание
shraybikus
27-02-2020, 16:14
для которого нужны пары имен в одну строку через подчеркивание »
Это будет менее предпочтительно, т.к. подчёркивание может быть в имени файла.
megaloman
27-02-2020, 16:34
shraybikus, Нужно их переименовать согласно списку, который содержится в текстовом файле: »пример файла приведите, есть ли там пути, расширения и т. д. »Просили ведь файл, а не его изображение. Суть - какая там кодировка. Предположил, что 1251@Echo Off
cls
>nul Chcp 1251
Set "BoxIn=Z:\Box_In\29721"
Set "RenFile=Z:\Box_In\restore.txt"
Call :ReInDir "%RenFile%" "%BoxIn%"
pause
Exit /B 0
:ReInDir
If Not Exist "%~2\*.*" Exit /B 1
Set /A i=0
FOR /F "usebackq delims=" %%s IN (`2^>nul More "%~1"`) Do (
Set /A i+=1
Call :ReFile %%i%% "%%s" %2
)
Exit /B
:ReFile
If %1==1 Set "OldName=%~2" &Exit /B
Set "NewName=%~2"
If Exist "%~3\%OldName%" Echo Ren "%~3\%OldName%" "%NewName%"
Set /A i=0
Exit /B 0@Echo Off
cls
>nul Chcp 1251
Set "BoxIn=Z:\Box_In"
Set "RenFile=Z:\Box_In\restore.txt"
Set SubDir="00142" "08278" "14117" "22" "3333333" "29721" "32545" "32730"
For %%d In (%SubDir%) Do Call :ReInDir "%RenFile%" "%BoxIn%\%%~d"
pause
Exit /B 0
:ReInDir
If Not Exist "%~2\*.*" Exit /B 1
Set /A i=0
FOR /F "usebackq delims=" %%s IN (`2^>nul More "%~1"`) Do (
Set /A i+=1
Call :ReFile %%i%% "%%s" %2
)
Exit /B
:ReFile
If %1==1 Set "OldName=%~2" &Exit /B
Set "NewName=%~2"
If Exist "%~3\%OldName%" Echo Ren "%~3\%OldName%" "%NewName%"
Set /A i=0
Exit /B 014117
Приложение № 1.pdf
08278
Приложение № 2.xlsx
32545
Приложение № 3.docx
0000142
Приложение № 6666.docx
29721
Приложение № 4.docx
32730
Приложение № 5.docx
30000142
Приложение № 36666.docx
00142
Приложение № 6.docx
Уберите Echo перед Ren - я сейчас его красным выделил
shraybikus
27-02-2020, 16:53
Если нужно переименовать файлы в конкретной папке »
Да, именно это и нужно.
Попробовал переименовать, вроде команда строится правильно:
Ren "C:\123\1\04238" "Приложение № 1.pdf"
Ren "C:\123\1\10227" "Приложение № 2.xlsx"
Ren "C:\123\1\03227" "Приложение № 3.docx"
Ren "C:\123\1\32591" "Приложение № 4.docx"
Ren "C:\123\1\08606" "Приложение № 5.docx"
Ren "C:\123\1\30239" "Приложение № 6.docx"
Для продолжения нажмите любую клавишу . . .
но самого переименования - не происходит. Файл прикрепил.
shraybikus
27-02-2020, 17:03
берите Echo перед Ren »
Во, класс! Кодировку тоже убрал, а то кракозябры выскочили. Спасибище, то что надо!!!
Без каких-либо проверок:
@echo off
setlocal enableextensions enabledelayedexpansion
set sListFile=list.txt
for /f "usebackq delims=" %%i in (`type "%sListFile%" ^| find.exe /v /c ""`) do set /a iCount = %%~i / 2
<"%sListFile%" (
for /l %%i in (1, 1, %iCount%) do (
set /p sSourceFile=
set /p sDestFile=
echo ren "!sSourceFile!" "!sDestFile!"
)
)
endlocal
exit /b 0
shraybikus
28-02-2020, 09:22
Без каких-либо проверок: »
Да, с красным echo тоже не работает. И файл sListFile - без расширения не прокатывает. И путь для обработки файлов - не указать.
Но это всё мелочи, наверно.
Кстати, забыл сказать, для чего мне это понадобилось. Есть такой файлобменник "безлимитный" usercloud с отличной скоростью на upload. В бесплатной версии там ограничение 49 мегабайт на файл, чтобы он не удалился через месяц неактивности. Я залил туда многотомный архив с томами по 49 мегабайт. Но и он тоже удалился спустя месяц, потому что? похоже, многотомный архив тоже воспринимается как один файл хоть об этом нигде не написано у них на сайте.
Для того, чтобы попытаться обойти данное ограничение, я нашёл и допилил скрипт переименовывающий файлы случайными цифрами. Список переименования также пожал в RAR с паролем, и положил в ту же папку с многотомным архивом. Продолжаю вести наблюдение. :)
Большое спасибо всем за помощь.
Да, с красным echo тоже не работает. »
echo — только для того, чтобы посмотреть на команду. Для реального переименования echo нужно убрать.
И файл sListFile - без расширения не прокатывает »
«Прокатывает». Не «прокатывает» — если в пути/имени файла пробельные символы. Достаточно просто обрамить %sListFile% кавычками. Другое дело, что переменную окружения завести — я завёл, а вот пользовать её — забыл. Я поправил код выше.
И путь для обработки файлов - не указать. »
А зачем его нужно указывать отдельно? Достаточно всего лишь исполнять пакетный файл в искомом каталоге.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.