2013-03-03 2 views
5

Я хочу использовать пакетный файл Windows для копирования файла (myfile0001.bdg) из одного конкретного каталога в другой. Но я хочу проверить, существует ли файл в целевом каталоге, и если ответ «да», увеличьте файл до 0001 и еще раз проверьте, существует ли файл (myfile0002.bdg) и т. Д., Пока файл не существует, и скопируйте файл с новым заголовком.Windows: скопируйте файл до тех пор, пока файл не существует

Так, если в целевом каталоге, у меня есть эти файлы:

 
myfile0001.bdg 
myfile0002.bdg 
myfile0003.bdg 
myfile0004.bdg 
myfile0005.bdg 
myfile0006.bdg 

Новый файл должен быть назван myfile0007.bdg. В следующий раз, когда я буду исполнять партию, новый файл будет myfile0008.bdg и т. Д.

Я знаю, что есть команда «IF EXIST», но я не знаю, что делать, что мне нужно.

==============

  • Я под Windows 7 x32
  • каталог источника "C: \ Users \ RAMBYTES \ ДОКУМЕНТЫ \"
  • целевой каталог "P: \ BACKUP \"
  • файл "MYFILE0001.BDG"

ответ

1

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

@echo off 

set source_file=C:\USERS\RAMBYTES\DOCUMENTS\MYFILE0001.BDG 
set target_dir=P:\BACKUP\ 
set done=0 

for /l %%i in (1,1,1000) do (
    call :check_and_copy %%i 
    if errorlevel 1 goto :eof 
) 

goto :eof 

:check_and_copy 
    setlocal EnableDelayedExpansion 
    set num=000000%1 
    set fnum=!num:~-4! 

    set fname=%target_dir%\myfile%fnum%.bdg 
    rem echo %fname% 
    if not exist "%fname%" (
    echo copying %source_file% to %fname% 
    exit /b 1 
) 
    exit /b 0 

Нет ошибки обработки, если в целевом каталоге содержится более 1000 файлов. Если вы хотите increas лимита файла, вам нужно настроить «главный» цикл и «форматирование» числа в подпрограммой

Трюк с добавлением ведущих нулей был взят отсюда: https://stackoverflow.com/a/9430912/330315

1
@ECHO OFF 
SET destdir=c:\destdir 
SET newname=myfile0000 
FOR /f %%i IN (' dir /b /on %destdir%\myfile????.bdg ') DO SET newname=%%~ni 
SET newname=1%newname:~-4% 
SET /a newname+=1 
SET newname=myfile%newname:~-4%.bdg 
COPY myfile0001.bdg %destdir%\%newname% 

сменить каталог назначения по желанию и при необходимости включить исходный каталог.

+0

Полезная идея использовать 'dir' для поиска используемой фамилии. Обратите внимание, однако, что этот метод игнорирует тот факт, что номер исходного файла может быть достаточно большим, чем номер последнего имени в целевом каталоге. То есть число в конечном имени будет рассчитываться на основе последнего имени в '% destdir%' независимо. –

0
  1. Возьмите имя файла.

  2. Извлечь числовую часть.

  3. Проверьте, существует ли соответствующее целевое имя.

  4. Если да, то

    4,1) увеличить числовую часть;

    4.2) если оно не превышает максимально возможное число, перейдите к шагу 3;

    4.3) в противном случае прекратить действие.

  5. Если целевое имя не существует, скопируйте файл с текущей числовой частью и завершите работу.

Хотя алгоритмически условие в 4.2 может быть более естественным, чтобы быть проверенным сразу после увеличения числовой части, как я выразился выше, ниже скрипт выполняет проверку в другой точке в начале цикла, которая начинается сразу после извлечения исходного числового значения из исходное имя файла. Реалистично, это казалось мне более удобным.

Во всех других отношениях, скрипт реализует тот же алгоритм:

@ECHO OFF 
SET "fname=%~n1" 
SET counter=1%fname:~-4% 
:loop 
IF %counter% GTR 19999 (
    1>&2 ECHO Cannot copy the file: no free slots. 
    EXIT /B 1 
) 
SET "targetname=%~2\%fname:~0,-4%%counter:~1%%~x1" 
IF EXIST "%targetname%" (
    SET /A counter+=1 
    GOTO loop 
) ELSE (
    COPY %1 "%targetname%" 
) 

объяснить некоторые детали:

  1. тильда (~) в ссылках на позиционные параметры означает де-процитировать соответствующего параметра.

    Иногда в сценарии тильда также сопровождается модификатором. Здесь используются два модификатора, n и x. Первое приводит к тому, что параметр расширяется только до соответствующего имени файла (без пути и расширения), а последний извлекает только расширение.

    Вы можете узнать больше о модификаторе в встроено-командах FOR (запустив

  2. Переменной fname среды необходим потому, что извлечение из частей имени может быть сделано только от переменных окружения. Выражение %fname:~-4, в частности, оценивает последние четыре символа значения fname. Более конкретно, он читает: извлечение подстроки, которая начинается с 4-го символа с конца, и, поскольку -4 не сопровождается другим аргументом, включает в себя все символы из этого точка до конца строки.

    Другое аналогичное выражение, %fname:~0,-4%, делает обратное: оно возвращает содержимое fnameкроме последних четырех символов. Смысл чисел таков: извлеките подстроку, которая начинается в начале строки (смещение 0), и охватывает диапазон до и включая символ со смещением 4 от конца.

    Еще одно выражение этого вида, %counter:~1, извлекает символы, начиная со второго (например, смещение 1) и вплоть до конца строки (без второго аргумента).

    Запустите SET /?, чтобы узнать больше о строковых выражениях.

  3. Для реализации counter может потребоваться пояснение. Необходимо добавить 1 перед числовой частью имени файла, чтобы все значение могло быть правильно интерпретировано и обработано при его увеличении.

    Дело в том, что числовое значение, начинающееся с 0, обрабатывается командным процессором CMD как восьмеричное, поэтому начало 1 вначале заставляет его интерпретировать число как десятичное значение, которое оно фактически есть. При построении полного имени целевого файла нам просто нужно отказаться от добавленного 1, для которого используется %counter:~1.

+0

Thnaks много для вас помощи ... Я попробую на этой неделе! Я постараюсь дать некоторые новости об этом. – user2129046