Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Переименовать файла с условием... (http://forum.oszone.net/showthread.php?t=347433)

9119 23-12-2020 22:22 2943987

Переименовать файла с условием...
 
Добрый.

Есть файл - 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 (или до бесконечности)

alpap 23-12-2020 23:50 2943997

Понятное дело несколько вопросов:
- как файл попадает в папку (чем/кем заносится/создается)
- какие еще могут быть файлы в папке, вообще важно именно нет ли файлов с идентичным именем другого расширения

megaloman 23-12-2020 23:54 2944001

Код:

@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

Iska 24-12-2020 00:57 2944006

Мои пять копеек:
Скрытый текст
Код:

@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


9119 24-12-2020 09:32 2944021

Цитата:

Цитата alpap
- как файл попадает в папку (чем/кем заносится/создается)
- какие еще могут быть файлы в папке, вообще важно именно нет ли файлов с идентичным именем другого расширения »

1_ копированием в папку.
2 - только этот файл.

Цитата:

Цитата Iska
Мои пять копеек: »

спасибо. это работает.

megaloman 24-12-2020 09:49 2944022

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


9119 24-12-2020 10:55 2944030

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 2944033

9119, ИМХО, скрипач CD не нужен.
Цитата:

Цитата 9119
Для выхода нажмите любую кнопку »

Такие сообщения сто лет тому назад меня одна бухгалтерша отучила делать. В одном из моих творений я его применил, бухгалтерша из более чем сотни кнопок выбрала Pause :)

Iska 24-12-2020 22:20 2944107

Упрощение кода на основе идеи коллеги 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 2944116

Вариант Iska, еще короче, хотя ИМХО иметь процедуру гораздо удобнее, да и, по большому счету, этот вариант не короче, чем с процедурой.
Код:

@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

Заремлен вариант, когда файл и скрипт в одной папке

alpap 25-12-2020 16:17 2944163

я, когда задавал вопросы выше, предполагал такой вариант (он очень похож на предложенные выше, но выложу раз уже влез в тему)
Код:

@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



Время: 23:38.

Время: 23:38.
© OSzone.net 2001-