Вопрос

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

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

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

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

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

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

Это было полезно?

Решение

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top