在具有特定扩展名的目录中查找和安装最新文件

时间:2019-05-31 13:12:48

标签: batch-file

我正在尝试搜索最新的.msi文件,并将其安装在后台。

我尝试遵循this link的帮助,但没有帮助。

这是我目前拥有的:

  @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 个答案:

答案 0 :(得分:1)

使用Powershell解决方案的建议:

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

这将在后台启动当前文件夹中具有最新写入时间的.msi文件。

答案 1 :(得分:1)

@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 fullpath,echo输出msi 到标准输出进行检查的路径,以及 goto :FoundFile事件发生。

msiexec.exe使用最新文件运行安装。

注意

NewestFile可能包含带尾部空格的msi路径。 离开时不会有任何伤害,我选择不修剪 以免在不必要的修剪操作中造成伤害。

测试表明wmic处理实际路径, 不重新解析点,即符号链接的路径。确保运行 实际路径中的脚本,否则name like ... wmic的查询可能不匹配任何内容。

您可以在 ::ENTER YOUR CODE BELOW::和 您发布的代码中的::END OF YOUR CODE::,而没有 @echo offsetlocal,因为您已经有这些行。