Как я могу распаковать самый новый файл в каталоге в файле BAT?

#build-process #batch-file #unzip

Вопрос:

Я работаю над системой сборки. Система сборки публикует результаты в виде zip-файла в каталоге. К сожалению, у меня нет простого способа узнать имя zip-файла, потому что он помечен временем. Для следующей операции я должен распаковать этот zip-файл в определенное место, а затем выполнить еще несколько операций с файлами.

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

Как я могу выполнить команду распаковать, которая будет действовать только для самого нового zip-файла в каталоге, игнорируя все остальные?

ПРАВКА: Вместо этого я решил использовать возможности ANT для этой задачи. Тем не менее, это все еще ловкий трюк, чтобы увеличить скорость… Спасибо за ответ!

Ответ №1:

Это должно сделать это:

 FOR /F usebackq %%i IN (`DIR /B /O-D *.ZIP`) DO UNZIP %%i amp;amp; GOTO DONE || GOTO DONE
:DONE
 

Это работает следующим образом:

  • DIR /B /O-D *.ZIP перечисляет все ZIP — файлы в обратном порядке по дате в «голом» — то есть только по имени- формате.
  • FOR /F usebackq используется для циклического выполнения вывода команды.
  • amp;amp; GOTO DONE || GOTO DONE убедитесь UNZIP , что выполняется только для первого файла. Вам нужны оба amp;amp; (и) и || (или) на случай, если по какой-либо причине не удастся распаковать архив.

Вам нужно будет изменить UNZIP %%i любую команду распаковки, которую вы хотите использовать.

РЕДАКТИРОВАНИЕ Вышеизложенного будет работать до тех пор, пока имя файла Zip не содержит пробелов. Если вы хотите обрабатывать имена файлов с пробелами, используйте следующий вариант:

 FOR /F "tokens=*" %%i IN ('DIR /B /O-D *.ZIP') DO UNZIP "%%i" amp;amp; GOTO DONE || GOTO DONE
:DONE
 

Различия заключаются в:

  • Опция «токены=*» возвращает все имя файла, даже если оно содержит пробелы.
  • Имя файла, переданное для РАСПАКОВКИ, указано в кавычках
  • Этот вариант использует одинарные кавычки для команды DIR, поэтому не нуждается в опции «usebackq».

Ответ №2:

Если Cygwin или другая Unix-подобная среда является альтернативой

 unzip "$(ls -tr *zip | tail -n1)"
 

сделал бы это

Комментарии:

1. Вы также можете скачать unxutils.sourceforge.net и добавьте его в свой путь, чтобы вы могли использовать множество стандартных утилит Unix из командной строки-это должно быть на моих компьютерах с Windows, так что на случай, если я забуду dir против ls, cat против типа и т. Д. Приятно иметь grep, awk и тому подобное тоже.

2. Извините, исправлена последняя ссылка-похоже, они переместили вещи и чтобы получить фактические файлы, на которые вам нужно перейти sourceforge.net/projects/unxutils

Ответ №3:

Я думаю, что вам понадобится 7-zip, чтобы иметь возможность выполнять сжатие/распаковку сценариев.

Ответ №4:

Зачем использовать файлы bat, если у вас есть powershell или консольные приложения?