2017-01-05 7 views
2

iTunesのバージョンを確認するバッチファイルを作成しようとしています。バージョンがスクリプトにリストされているバージョンよりも低い場合は更新されます。バージョンに応じてiTunesを更新するバッチファイル

私が抱えている問題は、レジストリキーの値を自分のIF値にする最良の方法です。

私はGoogleをちょっと見ていて、やりたいことに合ったものを見つけることができません。

::Finds the value of the Version key 
REG QUERY "HKLM\SOFTWARE\Apple Computer, Inc.\iTunes" /v Version 

これは私が立ち往生している場所です。バージョンの値はどのように使用しますか?これにFORループを使用する必要がありますか?私はそれを試してみましたが、suではありませんでした。

::If the version matches the number below iTunes is up to date 
IF Version==12.5.4.42 @echo Up to date! && goto end 

::If the version is not equal to the number below 
IF NOT Version==12.5.4.42 && goto install 

::Installs the current version from the repository 
:install 
msiexec.exe ALLUSERS=true reboot=suppress /qn /i "%~dp0appleapplicationsupport.msi" 

msiexec.exe /qn /norestart /i "%~dp0applemobiledevicesupport.msi" 

msiexec.exe /qn /norestart /i "%~dp0itunes.msi" 

echo Cleaning Up Installation 

del C:\Users\Public\Desktop\iTunes.lnk 

:end 
exit 

私はこれを理解できないツールのように感じます。前にFORステートメントを扱っていない。私の愚かさのための事前の謝罪。あなたのスクリプトで

答えて

0

一つの具体的な問題は、この行の余分な&&持っていることである:

IF NOT Version==12.5.4.42 && goto install 

一時的にremはアウトarking @echo offは、あなたがこれらの簡単な構文エラーを見つけることができます。 Magooが指摘しているように、Versionは12.5.4.42に決してならない文字列です。バッチ内の変数は、評価するときは%に囲まれます(または時には!)。

もっと一般的には、バージョン番号を比較するときは、バージョン番号を客観化し、major.minor.build.revisionを理解できる言語を使用する方がよいでしょう。インストールされているバージョンが12.10.0.0などの場合は、インストールを開始したくありません。これをバッチで12.5.4.42と比較すると、インストールがトリガーされます。 12.10.x.xは12.5.x.xより大きい数値ですが、アルファベット順に少なく、ifの比較で低い値として扱われます。 CMDコンソールからの説明として

、これを入力して、何が起こるかを参照してください。

if 12.10.0.0 leq 12.5.4.42 @echo triggered! 

私はここに重い物を持ち上げるためのPowerShellを使用すると思います。ここでは、Batch + PowerShellハイブリッドスクリプトを使用したイラストを紹介します。私はiTunesをインストールしていないので、試していないので、味わい深くする必要があります。

<# : batch portion (begin multiline PowerShell comment block) 
@echo off & setlocal 

set "installer_version=12.5.4.42" 

powershell -noprofile "iex (${%~f0} | out-string)" && (
    echo Up to date! 
    goto :EOF 
) 

:install 
msiexec.exe ALLUSERS=true reboot=suppress /qn /i "%~dp0appleapplicationsupport.msi" 
msiexec.exe /qn /norestart /i "%~dp0applemobiledevicesupport.msi" 
msiexec.exe /qn /norestart /i "%~dp0itunes.msi" 
echo Cleaning Up Installation 
del C:\Users\Public\Desktop\iTunes.lnk 
goto :EOF 

: end batch/begin PowerShell hybrid code #> 

$regkey = "HKLM:\SOFTWARE\Apple Computer, Inc.\iTunes" 
$installed = (gp $regkey Version -EA SilentlyContinue).Version 
if (-not $installed) { 
    "iTunes not installed." 
    exit 1 
} 

# exits 0 if true, 1 if false (-le means <=) 
exit !([version]$env:installer_version -le [version]$installed) 

方法for /Fループを使用し、regの出力や他のコマンドをキャプチャするために、しかし、あなたが尋ねた質問に答えます。詳細については、cmdコンソールのfor /?を参照してください。

+0

面白い方法です。私はそれをテストし、何が起こるかを見てみましょう!!!!! – Kellanist

+0

iTunesがインストールされていない場合、またはバージョンがリストされているバージョンよりも低い場合は、iTunesをインストールしたい場合は、どうすればよいでしょうか? – Kellanist

+0

@Kellanist私の解決策はすでにそれをしている(私は思う)。 PowerShellが 'exit 1'を実行すると、実行スレッドはバッチスクリプトに戻ります。 PowerShellがerrorlevel 1で終了すると、 '&&'はスキップされ、 ':install'で実行が続けられます。ところで、Stack Overflowへようこそ!私の答えが役に立ったら、それを合格とマークすることを検討してください。なぜこのことが重要であるかについては、[このページを見る](http://meta.stackexchange.com/questions/5234/)を参照してください。 – rojo

-1
IF Version==12.5.4.42 @echo Up to date! && goto end 

文字列Versionは、文字列12.5.4.42に等しいことになるだろうことはありません。コードは

IF %Version%==12.5.4.42 @echo Up to date!&goto end 

(単一&を連結コマンド)

する必要がありますので、次のifは不要で、内容Versionを必要としています。その声明に到達するには、バージョンでなければならない - 12.5.4。42は、それ以外の場合は実行が:eofのコロンは、を必要とするgoto :eofは「物理的なファイルの終わりに行く」を意味、ところで:end

に転送されていたであろう。

関連する問題