Поиск и установка последнего файла в каталоге с определенным расширением - PullRequest
2 голосов
/ 31 мая 2019

Я пытаюсь найти последний .msi файл и установить его в фоновом режиме.

Я попытался воспользоваться помощью по этой ссылке , но это не помогло.

Это то, что у меня сейчас есть:

  @echo off
setlocal

if _%1_==_payload_  goto :payload

:getadmin
    echo %~nx0: elevating self
    set vbs=%temp%\getadmin.vbs
    echo Set UAC = CreateObject^("Shell.Application"^)                >> "%vbs%"
    echo UAC.ShellExecute "%~s0", "payload %~sdp0 %*", "", "runas", 1 >> "%vbs%"
    "%temp%\getadmin.vbs"
    del "%temp%\getadmin.vbs"
goto :eof

:payload

::ENTER YOUR CODE BELOW::   

FOR /F "eol=| delims=" %%I IN ('DIR "directory" /A-D /B /S /O-D /TW 2^>nul') 
DO (
    ECHO %%~I
    SET "NewestFile=%%~I"
    GOTO FoundFile
)
ECHO No *.msi file found!
GOTO :EOF

:FoundFile
msiexec.exe /I "%NewestFile%" /Q

::END OF YOUR CODE::

echo.
echo...Script Complete....
echo.

Я предполагаю, что проблема в :FoundFile и части выполнения или в поиске правильного файла, основанного на времени.

Я подумал, может быть, мне придется использовать:

forfiles /p "dir" /m *.msi /S /D +%Date%

, но я не совсем уверен.

Ответы [ 2 ]

1 голос
/ 31 мая 2019
@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, поскольку у вас уже есть эти строки.

1 голос
/ 31 мая 2019

Предложение по решению с использованием Powershell:

Get-ChildItem *msi | Sort-Object -Property LastWriteTime | Select -Last 1 | %{Start-Process $_.FullName -WindowStyle Hidden}

В фоновом режиме будет запущен MSI-файл с самым последним временем записи в текущей папке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...