#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 или консольные приложения?