【问题标题】:Batch script which automatically executes silent installs (errors out back to cmd)自动执行静默安装的批处理脚本(错误返回到 cmd)
【发布时间】:2016-10-30 06:52:14
【问题描述】:
@echo off

Setlocal enableextensions EnableDelayedExpansion
REM %%~pI        - expands %I to a path only
REM %%~nI        - expands %I to a file name only
REM %%~xI        - expands %I to a file extension only
REM %%~fI        - expands %I to a fully qualified path name
cls
set "var="
set /a total=0

set setupLocation=%SYSTEMDRIVE%\setup\
set installer=*.lnk


for %%s in ("%setupLocation%%installer%") do (
    set /a total+=1
) 

echo.
echo  %total% Programs to be installed:
echo.
set /a count=0

for %%I in ("%setupLocation%%installer%") do (

set currentInstall=%%~nI
echo %currentInstall% 

        for %%s in ("%setupLocation%*.exe") do (
        SET var=%%s
        SET var|FINDSTR /b "var="|FINDSTR /i %currentInstall% >nul
        IF ERRORLEVEL 1 (echo.>nul) ELSE (for /f "delims=" %%i in ('echo %%s') do set Program[%count%]=%%~nI )

        ) 

        for %%s in ("%setupLocation%*.lnk") do (
            SET var=%%s
            SET var|FINDSTR /b "var="|FINDSTR /i %currentInstall% >nul
            IF ERRORLEVEL 1 (echo.>nul) ELSE (for /f "delims=" %%i in ('echo %%s') do set File[%count%]=%%i )
            echo !File[%count%]!

        ) 


        for %%s in ("%setupLocation%*.loc") do (
            SET var=%%s
            SET var|FINDSTR /b "var="|FINDSTR /i %currentInstall% >nul
            IF ERRORLEVEL 1 (echo.>nul) ELSE (for /f "delims=" %%i in ('type %%s') do set Dir[%count%]=%%i )
            echo !Dir[%count%]!

        ) 
set /a count=%count%+1
echo %count%

) 
echo.
pause




for /F "tokens=2 delims==" %%s in ('set Program[') do (
echo %%s
set /a counter+=1
)

echo test %counter%



:loop
cls

if %counter% EQU 0 goto end


for /l %%n in (0,1,%counter%) do (
    if exist !Dir[%%n]! (
        echo !File[%%n]! Already Installed.
        SET /A counter=%counter%-1
        pause
        if %counter% EQU 0 goto end
        echo %counter%
    ) else (

        echo.
        echo Installing !Program[%%n]! & echo.
        echo ******************************************************************************* & echo.

        echo   Install Location: !Dir[%%n]! & echo.
        echo     Setup Location: !File[%%n]! & echo.

        start "" /w /b !File[%%n]! 

    )
    SET /A counter=%counter%-1
    echo %counter% Programs to be installed.
)   


    goto loop

:end    
echo Everything already installed.
pause

它会检查根文件夹 C:\setup\ 的 3 个文件,分别是:

nmap.lnk
nmap.exe
nmap.loc

wireshark.lnk
wireshark.exe
wireshark.loc 

(包含wireshark的默认安装目录,用于检查程序是否已经存在于程序文件目录中。)

我以此为基础将大量程序整合到自定义 Windows 映像中,而不是获取每个程序的注册表。

主要问题是它返回到 cmd 时出错,我遇到了算术没有应用的问题,因为我从 var 中减去,下一个回显没有反映这一点。

如果有人对安装部分中使用的循环有替代解决方案,将不胜感激。

并且墨水将具有 /s 静默参数。

我打算在安装后添加它的选项,以便在安装后自行清理。

【问题讨论】:

  • 您可能需要解释您的三个文件及其用途。似乎没有检查是否安装了任何东西,只是检查当前目录中是否存在 .loc 文件的名称。
  • 您在代码块中。您需要使用延迟扩展。

标签: batch-file cmd windows-7


【解决方案1】:

这不是做类似的事情吗,即检查所有三个文件是否存在,如果路径,(不带尾随反斜杠),写为 .loc 内的第一行不存在开始关联的 .lnk 文件。

@Echo Off
SetLocal EnableExtensions EnableDelayedExpansion

Set "SetUpLocation=%SYSTEMDRIVE%\Setup"

PushD "%SetUpLocation%"||Exit/B

ClS
Set "i=0"
For %%s In (*.loc) Do (If Exist "%%~ns.lnk" (If Exist "%%~ns.exe" (
    Set/P IL=<"%%s"
    If Exist "!IL!\" (Echo=Program %%~ns already installed) Else (
        Echo=Installing %%~ns& Echo.
        Echo *******************************************************************************
        Echo.& Echo   Install Location : !IL!& Echo.
        Echo   Setup Location   : %SetUpLocation%& Echo.
        (Start "" /W /B "%%~ns.lnk")&&Set/A i+=1))))
Echo.
Echo  %i% Programs were installed:
Echo.

PopD
Timeout/T -1 >Nul

我不知道等待是否适用于 .lnk 文件,因为 .exe 将运行,而不是 .lnk,因此您可能必须将开关放在 .loc 文件的第二行,不要使用 .lnk 文件,然后使用读取开关直接运行 .exe。

@Echo Off
SetLocal EnableExtensions EnableDelayedExpansion

Set "SetUpLocation=%SYSTEMDRIVE%\Setup"

PushD "%SetUpLocation%"||Exit/B

ClS
Set "i=0"
For %%s In (*.loc) Do (If Exist "%%~ns.exe" (
    (For %%I In (IL ES) Do (Set "%%I="&Set/P "%%I="))<"%%s"
    If Exist "!IL!\" (Echo=Program %%~ns already installed) Else (
        Echo=Installing %%~ns& Echo.
        Echo *******************************************************************************
        Echo.& Echo   Install Location : !IL!& Echo.
        Echo   Setup Location   : %SetUpLocation%& Echo.
        (Start "" /W /B "%%~ns.exe" !ES!)&&Set/A i+=1)))
Echo.
Echo  %i% Programs were installed:
Echo.

PopD
Timeout/T -1 >Nul

【讨论】:

  • 再次感谢,我对 pushD 命令进行了一些研究,这似乎就是我崩溃到 cmd 的原因,它允许我在其他目录中工作并仍然继续运行我的批处理文件,帮助很大!
【解决方案2】:

谢谢!是的,你提供的例子很完美!,正是我需要的。

也更喜欢您的代码。我有很多多余的行,并且更习惯于传递给变量以提高读者的理解。

不过,对于这种用途,这很好。

我可能会忽略检查匹配文件的选项,我这样做只是为了获得额外的功能。

从外观上看,使用带有 start 的 .lnk,

如果有人仍然想知道使用这个程序,它可以减轻在 Windows 上创建自定义图像时所需的工作量,因此您可以在安装新操作系统后自动安装软件:

而不是抓住注册键、开始菜单图标、驱动程序等。

并将它们全部添加到 .wa 或其他程序中,例如 win 工具包。

更多的只是比较这两个选项,对于一些软件,像这样。

【讨论】:

  • 能否请您将我的回答标记为正确,以便未来的访问者可能受益。
猜你喜欢
  • 2017-08-04
  • 1970-01-01
  • 2023-01-31
  • 1970-01-01
  • 1970-01-01
  • 2014-10-03
  • 2021-05-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多