2012-06-19 2 views
2

Немного архаичный вопрос, я боюсь, но здесь идет:Пакетный файл для переименования файлов в папке и обратно

У меня есть программа, которая производит некоторые файлы .raw в последовательности, например.

Example_1.RAW
Example_2.RAW

Это добавляет дополнительные значащие цифры к номеру по мере необходимости, например.

Example_10.RAW
Example_200.RAW

У меня есть необходимость преобразовать эти имена файлов в номера для запуска с помощью пакетного процессора, который затем производит больше файлов в качестве выходов. Я написал пакетный файл, который делает переименование и хранит старые и новые имена файлов в текстовом файле, мой код:

@echo off 
set i=1 
echo Running Batch Rename 
for %%f in (*.RAW) do (set file=%%f) & CALL :rename 

:rename 
echo %i% >>Names.txt 
echo %file% >>Names.txt 
echo. >>Names.txt 
ren %file% %i%.RAW 
set /A i+=1 

Это переименовывает все мои .RAWs как 1.Raw, 2.RAW и т.д. и создает Names.txt со старыми и новыми именами файлов. Благодаря тому, как номера процессов DOS это означают, что я получаю слегка выигрышный процесс нумерации, то есть он будет обрабатывать Ex_1, Ex_10, Ex_100, Ex_101 как 1, 2, 3, 4, что приведет к большему количеству работы в последующей обработке этих результатов, чтобы получить правильные результаты в правильных местах.

Можно ли написать другой пакетный файл, который принимает Names.txt и отменяет процесс для выходных файлов? Итак, это займет папка с 1.raw, 1.something, 1.som something else, обратитесь к Names.txt и переименуйте их в Example_1.raw и т. Д.?

+0

Вы не имеете n файлов txt для n сырых файлов? Если нет, вы можете сохранить исходное имя необработанного файла в txt-файле с именем, которое соответствует новому имени необработанного файла, например. магазин Example_1.RAW в файле 1.txt и переименуйте Example_1.RAW в 1.RAW. Другая партия будет перебирать файлы txt, находить соответствующий RAW-файл и переименовывать его в предыдущее имя. – Helbreder

+0

Helbreder - в то время как, возможно, это не самое прекрасное решение, которое, безусловно, является опцией, я мог бы просто удалить текстовые файлы после того, как выполнил постную обработку. Я предполагаю, что исходный код просто нужно изменить для повторения имени файла в% i% .txt. Любые подсказки относительно того, каков будет обратный код? –

+0

Это не проблема. Существуют инструменты для расширения расширений из имени файла. Я подготовлю ответ :) – Helbreder

ответ

2

Это должно сделать работу

@echo off 
set cnt=0 
del Names.txt > nul 2>&1 
echo Running Batch Rename 
for %%f in (*.RAW) do (
    set "file=%%f" 
    CALL :renameToNumber 
) 
echo .. Do the jobs ... 
rem ** As sample: copy the file 
copy *.raw *.some 
call :renameBack 
exit /b 

:renameToNumber 
set /A cnt+=1 
set "number=00000%cnt%" 
set "number=%number:~-4%" 
(echo %number% %file%) >> Names.txt 
ren "%file%" %number%.RAW 
exit /b 

:renameBack 
for /F "tokens=1,*" %%A in (names.txt) DO (
    set "number=%%A" 
    set "filename=%%~nB" 
    call ren %%number%%.* "%%filename%%_%%number%%.*" 
    call echo ren %%number%%.* "%%filename%%_%%number%%.*" 
) 
exit /b 
+1

Отлично! Единственное изменение, которое я сделал, это сбросить _ %% число %% в последних двух вызовах, поскольку мне нужны файлы обратно к их исходным именам файлов без их суффикса числа.Помимо этого, я просто разделил два переименования на отдельные файлы «Переименовать» и «НазваниеBack», и он работал как шарм. Благодаря! –

1

Вы можете подготовить два пакетных файлов, один для переименования файлов RAW в 1.Raw, 2.RAW и т.д., а второй один, чтобы повернуть вспять этот процесс обратно.

Rename скрипт сохраняет исходные имена RAW файлов в соответствующие текстовые файлы:

@echo OFF 
@setlocal ENABLEDELAYEDEXPANSION 


set I=1 

for %%G in (*.RAW) do (
    set ORIGINAL_NAME=%%~nG 
    ( 
     REM Try to rename file 
     ren "%%G" "!I!.RAW" 
    ) && (
     REM Renaming was successful 
     > "!I!.txt" echo !ORIGINAL_NAME! 
     set /A I+=1 
    ) || (
     REM Renaming was a failure 
     echo Cannot rename [!ORIGINAL_NAME!.RAW] file. 
    ) 
) 

@endlocal 

и сценарий RenameBack использует эту информацию, чтобы восстановить имена всех соответствующих файлов:

@echo OFF 
@setlocal ENABLEDELAYEDEXPANSION 


for %%F in (*.txt) do (
    set BASENAME=%%~nF 
    REM Read original name from txt file 
    for /F %%G in (%%F) do (
     REM iterate over all corresponding files 
     for %%H in (!BASENAME!.*) do (
      set EXTENSION=%%~xH 
      REM Remove dot from extension string 
      set EXTENSION=!EXTENSION:~1! 
      if not "!EXTENSION!" == "txt" (
       REM Process files 
       (
        REM try to rename corresponding file to old name 
        ren "!BASENAME!.!EXTENSION!" "%%G.!EXTENSION!" 
       ) && (
        REM Operation was successful - remove TXT file 
        del /F /Q "%%F" 
       ) || (
        REM Something went wrong 
        echo Cannot restore old name for file [!BASENAME!.!EXTENSION!]. 
       ) 
      ) 
     ) 
    ) 
) 

@endlocal 
2

я был в состоянии адаптируйте приведенный выше код, чтобы функционировать в рамках существующей пакетной процедуры, путем тестирования последнего файла в каталоге - с помощью «if errorlevel» - чтобы программа не выходила после того, как последний файл был достигнут, но вместо этого вернулся к моей программе.

:: *** Renumber .JPG files *** 

    setlocal EnableDelayedExpansion 
    set dir=C:%homepath%\Desktop\Temp 

    :: Create variable and set to zero 
    set cnt=0 

    :: For each file in specified class 
    for %%f in (%dir%\*.jpg) do (
     :: Get name of file 
     set "file=%%f" 
     :: Run specified Subroutine 
     CALL :renameToNumber 
    ) 

    :renameToNumber 
    :: Increment variable by 1 
    set /A cnt+=1 
    :: Preceed value of variable with 00000 
    set "number=00000%cnt%" 
    :: Delete all but final 2 digits 
    set "number=%number:~-2%" 
    :: Store new and original name of file 
    (echo %number% %file%) >> Names.txt 
    :: Rename file 
    ren "%file%" %number%.jpg 
    :: Quit Subroutine if no further files 
    if errorlevel==1 goto :Continue 
    :: Loop back to start of Subroutine 
    exit /b 

    :Continue 

:: *** Zip the image files into an RAR file *** 
    SET rar=C:\Program Files (x86)\WinRAR\RAR.exe 
    "%rar%" a -ep -m0 temp.rar "%dir%\*.*" 
Смежные вопросы