2016-03-21 13 views
0

私がやっていることは、複数のコンピュータでShockwaveを最新の状態に保つことです。私はこの小さなバッチスクリプトを書いたが、うまくいかない。 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データファイルの名前= 'C:\\ Windows \\ SysWOW64 \\ Adob​​e \\ Shockwave 12 \\ uninstaller.exe'」のバージョン/ format:list' cmdから実行したときの出力? – CristiFati

+0

バージョン番号と有効な数値でないドットを比較するので、 'if'は文字列の比較を行います。比較された文字列の最初のペアが結果を定義します。例えば' 1.2.12'は'1.2.3'より小さい... – aschipfl

答えて

0

は、小数点比較がケースgtr lss`が失敗した文字列として見られることを引き起こします。

: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 

:何あなたができることは、バージョンを比較し、あなたのループ

:: 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が述べたものを注目しない]を右後にフラット整数に受信変換であります

サイドノート: 何かには影響しませんが、/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%でしか動かないか、少なくとも私がそれらの更新を忍び抜けるまで、LOL。 – travissimo

+0

@travissimoさて、私は各バージョンのテープの最大文字列の長さを確認できませんでした。各文字列が最大3桁の長さであったとすると、スクリプトを使用して長さ 'if lss 4'を取得し、次にバージョン番号の先頭に' 4-strLength'ゼロを追加します。バッチは、この高いintigers 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 

このルーチンは問題を解決するはずです。

アイデアは、比較を行う前に、バージョン文字列を先行ゼロで埋められた文字列に変換することです。

ルーチンは、2番目のパラメータを4つの部分に分割し、各部分に1000を加算して4文字の結果を得、4つの別々の部分文字列の前に任意の "v"を付けます。環境をきれいに保つために、ブラケットをsetlocal/endlocalで終えました。

主な部分は、解説目的で3つの異なるバージョン番号を試しています。選択された宛先ラベルをどのように解釈するかによって(単にechoを使用して表示されます)、私にとってはうれしく働いていました(「新しい」とは、インストールされたバージョンが%result%のものより新しいことを意味します)論理インストールされたバージョンは、指定されたバージョンよりも上にある)

+0

バッチが16文字の長さの文字列を正常に比較できるかどうかわかりませんでした – Bloodied

関連する問題