batch-file
  • decimal
  • string-comparison
  • 2016-03-21 117 views 0 likes 
    0

    我想要做的是保持Shockwave在多臺計算機上最新。我寫了這個小批處理腳本,但它不工作。當它發現衝擊波時,它會告訴我他們要麼沒有版本,要麼版本更新。當然,我相信這兩個數字都與小數點有關,但我不完全確定。字符串與小數比較

    :Check_Ver 
    FOR /F "tokens=2 delims==" %%I IN (
        'wmic datafile where "name='C:\\Windows\\SysWOW64\\Adobe\\Shockwave 12\\uninstaller.exe'" get version /format:list' 
    ) DO SET "RESULT=%%I" 
    
    ECHO %RESULT% 
    IF /I %RESULT% GTR 12.2.4.194 GOTO :NEWERVERSION 
    IF /I %RESULT% EQU 12.2.4.194 GOTO :CORRECTVERSION 
    IF /I %RESULT% LSS 12.2.4.194 GOTO :OUTDATEDVERSION 
    
    +0

    什麼'wmic datafile其中「name ='C:\\ Windows \\ SysWOW64 \\ Adob​​e \\ Shockwave 12 \\ uninstaller.exe'」獲取版本/格式:列表輸出從cmd運行時? – CristiFati

    +0

    由於您正在比較版本號和其中不是有效數字的點,因此'if'將進行字符串比較,因此比較字符串的第一對不同字符定義了結果,例如'1.2.12'爲少於'1.2.3' ... – aschipfl

    回答

    0

    在分批/命令提示,小數點導致相比於被看作是一個字符串,在這種情況下gtr lss`失敗。你可以做的是轉換的版本進行比較,並在之後的for循環

    :: turn the for loop's return value to an integer, replace all "." with "" 
    set "result=%result:.=%" 
    
    :: Then, change your fixed version "12.2.4.194" [assuming it's a static value] 
    :: to "1224194" and compare using your if commands. 
    

    新劇本[不提什麼@CristiFati提到]收到平坦整數:

    :Check_Ver 
    FOR /F "tokens=2 delims==" %%I IN (
        'wmic datafile where "name='C:\\Windows\\SysWOW64\\Adobe\\Shockwave 12\\uninstaller.exe'" get version /format:list' 
    ) DO SET "RESULT=%%I" 
    
    ECHO %RESULT% 
    
    set "result=%result:.=%" 
    IF /I %RESULT% GTR 1224194 GOTO :NEWERVERSION 
    IF /I %RESULT% EQU 1224194 GOTO :CORRECTVERSION 
    IF /I %RESULT% LSS 1224194 GOTO :OUTDATEDVERSION 
    

    附註: 不影響任何內容,但/I標誌不是整數比較所必需的,並且命令本身不需要大寫,沒有區別但j更容易在眼睛上。

    +0

    可以說我正在比較的版本是這樣的:12.0.0.41940。那麼會發生什麼呢,它認爲12.0.0.41940是其中沒有的更大的數字。所以它是錯誤的。我如何解決這個問題? – travissimo

    +0

    可以說比較2.7.0.1948和21.0.0.176。它會說2.7.0.1948大於21.0.0.176。這是錯誤的,所以這隻會在90%的時間內工作,或者至少在我完成這些更新之前,大聲笑。 – travissimo

    +0

    @travissimo我不確定每個版本磁帶的最大字符串長度。假設每個字符串的長度最多爲3位,請使用腳本獲取長度,如果「lss 4」,則將「4-strLength」零添加到版本號的前面。批處理可能會遇到錯誤comapring這麼高,但我確定VBScript可以輕鬆處理。同樣,你遇到了敏感性,開發人員在升到更高位之前會做出一千甚至幾百次更新。或者用@ Magoo的回答,我真的必須開始跟蹤他並記錄筆記。 – Bloodied

    1
    @ECHO Off 
    SETLOCAL 
    SET "result=12.2.4.194" 
    ECHO %RESULT% 
    CALL :CONVERT results %result% 
    ECHO %results% 
    
    CALL :CONVERT resultv 12.2.4.194 
    
    ECHO compare %result% to 12.2.4.194 
    
    IF /I %RESULTs% GTR %resultv% ECHO(GOTO NEWERVERSION 
    IF /I %RESULTs% EQU %resultv% ECHO(GOTO CORRECTVERSION 
    IF /I %RESULTs% LSS %resultv% ECHO(GOTO OUTDATEDVERSION 
    
    
    CALL :CONVERT resultv 1.2.4.194 
    
    ECHO compare %result% to 1.2.4.194 
    
    IF /I %RESULTs% GTR %resultv% ECHO(GOTO NEWERVERSION 
    IF /I %RESULTs% EQU %resultv% ECHO(GOTO CORRECTVERSION 
    IF /I %RESULTs% LSS %resultv% ECHO(GOTO OUTDATEDVERSION 
    
    CALL :CONVERT resultv 12.10.4.194 
    
    ECHO compare %result% to 12.10.4.194 
    
    IF /I %RESULTs% GTR %resultv% ECHO(GOTO NEWERVERSION 
    IF /I %RESULTs% EQU %resultv% ECHO(GOTO CORRECTVERSION 
    IF /I %RESULTs% LSS %resultv% ECHO(GOTO OUTDATEDVERSION 
    
    GOTO :EOF 
    
    :CONVERT 
    SETLOCAL 
    FOR /f "tokens=1-4delims=." %%a IN ("%2") DO (
    SET /a resulta=1000+%%a 
    SET /a resultb=1000+%%b 
    SET /a resultc=1000+%%c 
    SET /a resultd=1000+%%d 
    ) 
    endlocal&SET "%1=v%resulta%.%resultb%.%resultc%.%resultd%" 
    GOTO :eof 
    

    這個例程應該解決這個問題。

    想法是在進行比較之前將版本字符串轉換爲前導零填充的字符串。

    :convert例程簡單地將其第二個參數分解爲4個部分,並將1000部分添加到每個部分,產生一個4個字符的結果,然後將4個獨立的子字符串串在一起,前綴爲任意「v」。這是完成了setlocal/endlocal支架,以保持環境清潔

    主要部分嘗試3個不同的版本號用於deomnstration的目的。取決於你如何解釋所選擇的目的地標籤(並且簡單地使用echo顯示),它看起來對我來說工作很開心(「更新」意味着建議的版本比%result%中的安裝版本更新 - 只需更改比較器以給出更多邏輯安裝的版本是???比指定版本)

    +0

    我不確定批次是否可以成功比較16長度的字符串 – Bloodied

    相關問題