DOS DIR / TW переключатель не работает - PullRequest
1 голос
/ 17 января 2012

Я пытаюсь сравнить список файлов с контрольным файлом на их измененной отметке времени, используя

dir /b /tw /od controlfile olderfile | more +1

, это должно вернуть controlfile, так как дата изменения olderfile раньше controlfile.Однако он сравнивается с датой создания (дата создания olderfile - после controlfile) и поэтому всегда возвращает olderfile.Переключатель /tw должен указать dir использовать последнюю записанную дату (с dir /?), поэтому я не уверен, что делаю неправильно, если я хочу, чтобы / tw работал как задокументировано?

:ОБНОВЛЕНИЕ:

До сих пор у меня было olderfile в подпапке относительно controlfile.Когда я скопировал olderfile в тот же каталог, что и controlfile, сравнение сработало, как и ожидалось - то есть вышеприведенная команда вернула controlfile.Таким образом, наличие в подпапке, очевидно, нарушает сравнение (даже если дата изменения подпапки такая же, как у самой olderfile ранее, чем у controlfile).

Так что мой вопрос сейчас заключается в том, как мне обойтиэто учитывая, что структура каталогов обязательна?

1 Ответ

1 голос
/ 17 января 2012

Сначала объяснение, почему ваш код не работает.

Глядя на DIR без параметра / B, он всегда отображает путь к файлу в виде строки заголовка, а не вместе с именем файла. При использовании параметра сортировки вместе с двумя спецификациями файлов в одном каталоге команда может сортировать файлы и отображать их в одном заголовке каталога. Даже если имя файла повторяется, вы точно знаете, на какой файл ссылается заголовок.

Но если 2 спецификации файла находятся по разным путям, есть вероятность, что имя файла совпадает, и отличаются только пути. В этом случае сортировка бесполезна, если каждая спецификация файла не отсортирована по собственному заголовку; в противном случае вы не можете сказать, какой файл какой. Сортировать один файл не имеет особого смысла, но помните, что спецификация файла может включать подстановочные знаки, поэтому имеет смысл. Поэтому, когда опция сортировки объединяется с несколькими спецификациями файлов с использованием разных путей, DIR будет выполнять отдельную сортировку для каждого пути, каждый со своим собственным заголовком.

Добавление параметра / B удаляет заголовки пути, но не меняет поведение сортировки! Абсолютно глупый и бесполезный дизайн, но это то, что вы получаете.

Достижение решения гораздо более проблематично, особенно если вы хотите использовать чистую пакетную обработку только с собственными командами Windows. Работа с датами может привести в бешенство партию.

Самое подходящее пакетное решение, которое я могу придумать, - это временно скопировать 2-й файл в родительский каталог, выполнить сравнение в родительском каталоге, а затем удалить временную копию. Но это может быть проблемой, если файл большой. Также предполагается, что имя файла еще не существует в родительском каталоге. Если он существует (или может существовать), вы можете скопировать файл под другим именем, которое известно как уникальное. Конечно, вам нужно будет перевести результат.

Из того, что я могу сказать, любое другое пакетное решение потребует парсинга даты и времени. Это открывает целую банку червей. (Это выполнимо)

Если предложение COPY неприемлемо (я не виню вас, если вы решите его не использовать), тогда я рекомендую использовать что-то, кроме batch, возможно, VBScript, Javascript или Powershell. Или, возможно, гибридный подход, например, пакетный, с добавлением некоторого VBScript.

...