2016-10-30 24 views
1
@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:\設置\爲3個文件,爲:批次腳本自動執行無聲安裝(錯誤出回CMD)

nmap.lnk 
nmap.exe 
nmap.loc 

wireshark.lnk 
wireshark.exe 
wireshark.loc 

(包含默認安裝目錄wirehark用於檢查程序是否已經存在於程序文件目錄中。)

即時通訊使用此作爲基礎,將大量程序整合到自定義窗口圖像中,而不是爲每個程序獲取註冊表。

主要問題是它錯誤返回cmd,我有問題算術不適用,因爲我從var中減去,下一個回聲沒有反映。

如果有人有安裝部分中使用的循環的替代解決方案,將不勝感激。

並且墨水將具有無聲參數。

我打算在安裝之後爲它自己清理後自行添加選項。

+0

你可能需要解釋你的三個文件及其目的。似乎沒有檢查是否安裝了任何內容,只需檢查當前目錄中是否存在.loc文件的名稱。 – Compo

+0

您位於代碼塊內。您需要使用延遲擴展。 – Squashman

回答

0

這難道不是做類似的事情,即檢查是否存在三個文件,如果路徑,(沒有斜槓),寫成內的.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 
+0

再次感謝,我對pushD命令做了一些研究,這似乎是爲什麼我崩潰到cmd,它允許我在其他目錄中工作,並仍然繼續運行我的批處理文件,很好的幫助! – c0ldtrain

0

謝謝!是的,你提供的例子完美無缺,完全符合我的需求。

非常喜歡你的代碼。我有很多冗餘的線條,更習慣於通過變量來提高讀者的理解。

雖然這個用法,這可以。

我可能沒有選擇檢查匹配的文件,我只是爲了額外的功能。

,並從它的外觀,使用帶有開始作品的.lnk,

如果有人想利用這個程序,它仍然以減輕在Windows上創建自定義圖像時所需的努力,讓你

,而不是抓住了reg鍵,開始菜單圖標,驅動程序等

,並在.wa將它們放在一起或其他像贏工具程序:可以自動安裝後,一個新的操作系統安裝軟件。

更多的只是比較兩個選項,對於一些軟件,就像這樣。

+0

因此,請您將我的答案標記爲正確,以便未來的訪問者能夠獲益。 – Compo