我正在尝试搜索最新的.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%
但我不确定。
答案 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 off
和setlocal
,因为您已经有这些行。