Пакетный файл для копирования всех новых файлов, кроме самых последних - PullRequest
1 голос
/ 24 августа 2010

Я хотел бы написать пакетный файл, содержащий команды DOS (к сожалению, perl или другой язык не подходит) для выполнения следующей задачи.
В одном каталоге (c: \ MyData \ Directory1) находятся следующие файлы:
File2.txt
File2.dat
FileA.bin
FileQ.bin
FileC.bin
File8.bin
File2.bin
Все эти файлы имеютразные даты создания.Самый последний созданный файл * .bin - это File2.bin в этом примере, но это может быть любой файл с произвольным именем * .bin.

В другом каталоге (c: \ MyData \ Directory2) находятся следующие файлы:
File2.txt
File2.dat
FileA.bin
FileQ.bin

Вот что я хочу сделать:
Скопировать все файлы с расширением *.bin в Directory1, который еще не существует в Directory2 , за исключением для самого последнего созданного файла * .bin в Directory1.Таким образом, единственные файлы, которые должны быть скопированы в Directory2:
FileC.bin - Copy, потому что это файл bin, которого еще нет в Directory2
File8.bin - Copy, потому что это файл bin, которого еще нет в Directory2

Следующие файлы должны не быть скопированы в Directory2:
File2.txt - неправильное расширение, поэтому не копируйте его
File2.dat - неправильное расширение, поэтому не копируйте его
FileA.bin - уже существует в Directory2, поэтому не копируйте его
FileQ.bin - уже существует в Directory2, поэтому не копируйте его
File2.bin - самый последний файл * .bin, так что не

Спасибо за любую помощь!

Ответы [ 3 ]

3 голосов
/ 26 августа 2010
@echo off
@rem     Sorry for excessive commenting - I am a batch file newbie
@rem     Batch file will not work if there are spaces in names of directory or copied files
@rem     Next line allows for/do loop to work correctly
setlocal enabledelayedexpansion

@rem     Make temporary file that lists files from newest to oldest
DIR /o-d /b c:\temp\Directory1\*.bin > FileList.txt

@rem     Counter will be used to avoid copying newest file which is listed first
set /A Counter=1

@rem     Read in names of all files with chosen extension in the first directory
@rem     Names will be stored in the variable %%a
for /F "delims=" %%a in (C:\temp\FileList.txt) do (

@rem     Increment the counter
    set /A Counter+=1
@rem     Only copy files that are not the most recent one, so Counter>1
@rem     Requires the exclamation points because this is a string not number comparison
    if !Counter! gtr 1 (
@rem     If the file does not already exist in Directory2, copy it
            if not exist C:\temp\Directory2\%%a (
                    echo Copying C:\temp\Directory1\%%a to C:\temp\Directory2\%%a
                    copy C:\temp\Directory1\%%a C:\temp\Directory2\%%a
            )
    )
)
@rem     Remove the temporary file
del FileList.txt
0 голосов
/ 07 октября 2010

У меня нет Robocopy на моей машине, иначе я бы сделал /?и скажу тебе.Но, насколько я помню, у него гораздо больше возможностей (особенно по временным меткам).Это инструмент для Windows.http://en.wikipedia.org/wiki/Robocopy

0 голосов
/ 25 августа 2010

Вы можете использовать DIR *.bin /o-d /b > Files.txt, чтобы получить список файлов бина, упорядоченных последним и последним. Сделайте это в обеих папках (для разделения выходных файлов), а затем настройте цикл FOR, возможно, два вложенных цикла FOR, чтобы просмотреть два файла, выбрать те, которые нужно скопировать (с особой обработкой для первого в дате упорядоченный список) и скопируйте их из цикла. Глупые трюки были бы сделаны с установкой параметра Attribute и последующим использованием XCOPY /M для их одновременного копирования, но это выглядит слишком суетно.

Я всегда считал, что петли FOR - это чудовищные звери, и если вы можете найти способ, не использующий пакетные файлы, или какой-либо вид стороннего плагина, чтобы помочь, вы будете впереди игры. 1005 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...