@echo off
setlocal
rem Search in this directory path.
set "searchdir=%~dp0directory\"
rem Escape the directory path.
set "searchdir=%searchdir:\=\\%"
rem Display the directory path.
echo %searchdir%
rem Get the latest msi file.
for /f "usebackq tokens=1,* delims= " %%A in (`
wmic datafile where "extension='msi' and name like '%searchdir%%%'"
get lastmodified^, name ^| sort /r ^| findstr "\\"
`) do (
set "NewestFile=%%~B"
echo FoundFile: %%~B
goto :FoundFile
)
echo No *.msi file found!
exit /b
:FoundFile
rem Install the latest msi file.
msiexec.exe /i "%NewestFile%" /q
exit /b 0
Полный путь к каталогу настроен как directory
, который добавляется в каталог скрипта.Для использования с wmic
экранированные косые черты должны быть экранированы, поэтому замена переменных на \
на \\
сделана.Путь к каталогу затем отображается для проверки.
Цикл for
использует wmic
для получения метки времени lastmodified
и name
, которые будут полным путём к найденному MSI-файлу.sort /r
перевернет отсортированный порядок, поэтому последний будет первым.findstr "\\"
будет выводить только значения с разделителем пути \
.Переменная с именем NewestFile
хранит полный путь msi, echo
выводит путь msi к stdout для проверки, и происходит событие goto :FoundFile
.
msiexec.exe
запускает установку с самым новым файлом.
Примечание :
NewestFile
может содержать путь msi с конечными пробелами.Это не должно повредить уходу, и я решил не выполнять обрезку в случае причинения вреда в ненужной операции обрезки.
Тестирование показывает, что wmic
обрабатывает фактические пути, а не точки повторного анализа, то есть символьные пути.Убедитесь, что запуск сценария выполняется с фактического пути, иначе запрос name like ...
из wmic
может не совпадать ни с чем.
Вы можете заменить код между ::ENTER YOUR CODE BELOW::
и ::END OF YOUR CODE::
в опубликованном коде, без@echo off
и setlocal
, поскольку у вас уже есть эти строки.