Показать полную графическую версию : [решено] Переименовать файла с условием...
Добрый.
Есть файл - sound.mp3, по пути - С:\Temp
Помогите с батником:
Если в папке есть этот файл - переименовать его в sound1.mp3. Если его нет - вывести в консоль "Файл не найден"
Если в папке есть sound.mp3 и sound1.mp3 - переименовать sound.mp3 в sound2.mp3
Если в папке есть sound.mp3, sound1.mp3, sound2.mp3 - переименовать sound.mp3 в sound3.mp3
Если в папке есть sound.mp3, sound1.mp3, sound2.mp3, sound3.mp3 - переименовать sound.mp3 в sound4.mp3
.....и так до sound10.mp3 (или до бесконечности)
Понятное дело несколько вопросов:
- как файл попадает в папку (чем/кем заносится/создается)
- какие еще могут быть файлы в папке, вообще важно именно нет ли файлов с идентичным именем другого расширения
megaloman
23-12-2020, 23:54
@Echo Off
cls
Set "BoxIn=Z:\Box_In"
Set "FName=sound.mp3"
Set /A N=0
Call :MyRen "%BoxIn%" "%FName%"
Pause
Exit /B
:MyRen
Set /A N+=1
If Exist "%~1\%~n2%N%%~x2" GoTo :MyRen
Ren "%~1\%~2" "%~n2%N%%~x2" ||Echo Error with Ren "%~1\%~2" "%~n2%N%%~x2"
Exit /B
Часто mp3-файлы в имени содержат символы, которые CMD не в состоянии обработать. Так что надо понимать ограниченность CMD
Мои пять копеек:
@echo off
setlocal enableextensions enabledelayedexpansion
set sSourceFileName=sound
set sSourceFileExt=.mp3
set sSourceFile=%sSourceFileName%%sSourceFileExt%
set /a iCount = 1
if not exist "%sSourceFile%" (
echo Source file [%sSourceFile%] not found.
exit /b 1
)
:Repeat
2>nul ren "%sSourceFile%" "%sSourceFileName%!iCount!%sSourceFileExt%" || (
set /a iCount += 1
goto :Repeat
)
endlocal
exit /b 0
- как файл попадает в папку (чем/кем заносится/создается)
- какие еще могут быть файлы в папке, вообще важно именно нет ли файлов с идентичным именем другого расширения »
1_ копированием в папку.
2 - только этот файл.
Мои пять копеек: »
спасибо. это работает.
megaloman
24-12-2020, 09:49
Iska, Вот работает:@Echo Off
cls
For %%f In ("Z:\Box_In\sound.mp3") Do (
FOR /L %%N IN (1,1,1000) DO If Not Exist "%%~dpnf%%N%%~xf" (
Ren %%f "%%~nf%%N%%~xf" ||Echo Error with Ren %%f "%%~nf%%N%%~xf"
Exit /B
))
В чем мучения: Не понимаю, как работает цикл FOR /L %%N. Если поставить очень большой его предел, получим, несмотря на то, что
If отработал,
Exit /B вроде бы должен прекратить выполнение,
но цикл продолжает как-то крутиться и время выполнения скрипта тем больше, чем больше предел. @Echo Off
Call :MyRen "Z:\Box_In\sound.mp3"
Exit /B
:MyRen
SetLocal
Set /A N=0
:Begin
Set /A N+=1
If Exist "%~dpn1%N%%~x1" GoTo :Begin
Ren %1 "%~n1%N%%~x1" ||Echo Error with Ren %1 "%~n1%N%%~x1"
EndLocal
Exit /B
megaloman, спасибо.
правда Echo Error with Ren %1 "%~n1%N%%~x1" как по мне, лишнее, т.к перед этим в консоль уже выводится что файл не найден.
получается как дубль)
Для себя оставил так:
@Echo Off
cd "%~dp0"
set sSourceFileName=sound
set sSourceFileExt=.mp3
Call :MyRen "%~dp0%sSourceFileName%%sSourceFileExt%"
Exit /B
:MyRen
SetLocal
Set /A N=0
:Begin
Set /A N+=1
If Exist "%~dpn1%N%%~x1" GoTo :Begin
Ren %1 "%~n1%N%%~x1" || (echo Для выхода нажмите любую кнопку...
pause > nul)
EndLocal
Exit /B
megaloman
24-12-2020, 11:29
9119, ИМХО, скрипач CD не нужен.Для выхода нажмите любую кнопку »Такие сообщения сто лет тому назад меня одна бухгалтерша отучила делать. В одном из моих творений я его применил, бухгалтерша из более чем сотни кнопок выбрала Pause :)
Упрощение кода на основе идеи (http://forum.oszone.net/post-2944022.html#post2944022) коллеги megaloman:
@echo off
setlocal enableextensions enabledelayedexpansion
set sSourceFile=sound.mp3
set /a iCount = 1
if not exist "%sSourceFile%" (
echo Source file [%sSourceFile%] not found.
exit /b 1
)
:Repeat
for %%i in ("%sSourceFile%") do 2>nul ren "%sSourceFile%" "%%~ni!iCount!%%~xi" || (
set /a iCount += 1
goto :Repeat
)
endlocal
exit /b 0
megaloman
24-12-2020, 23:32
@Echo Off
Set "FileIn=Z:\Box_In\sound.mp3"
rem Set "FileIn=%~dp0sound.mp3"
Set /A N=0
:Begin
Set /A N+=1
For %%f In ("%FileIn%") Do (
If Exist "%%~dpnf%N%%%~xf" GoTo :Begin
Ren %%f "%%~nf%N%%%~xf" ||Echo Error with Ren %%f "%%~nf%N%%%~xf"
)
Exit /BИли так:@Echo Off
Set "FileIn=Z:\Box_In\sound.mp3"
rem Set "FileIn=%~dp0sound.mp3"
For %%f In ("%FileIn%") Do Set "dpnf=%%~dpnf" &Set "nf=%%~nf" &Set "xf=%%~xf"
Set /A N=0
:Begin
Set /A N+=1
If Exist "%dpnf%%N%%xf%" GoTo :Begin
Ren "%dpnf%%xf%" "%nf%%N%%xf%" ||Echo Error with Ren "%dpnf%%xf%" "%nf%%N%%xf%"
Exit /BЗаремлен вариант, когда файл и скрипт в одной папке
я, когда задавал вопросы выше, предполагал такой вариант (он очень похож на предложенные выше, но выложу раз уже влез в тему)
@echo off
set "d=C:\Papka"
set "f=sound.mp3"
call :#copy "%d%" "%f%"
pause& exit
:#copy
setlocal
pushd "%~1"
if not exist "%~n2%n%%~x2" (>nul copy "%~2" "%~n2%n%%~x2"|| echo Файл "%f%" не найден) else (set /a n+=1& goto #copy)
popd
endlocal
exit /b
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.
Available in ZeroNet 1osznRoVratMCN3bFoFpR2pSV5c9z6sTC