根据版本更新iTunes的批处理文件

时间:2017-01-05 18:47:46

标签: batch-file install registry itunes

尝试创建将检查iTunes版本的批处理文件,然后在版本低于脚本中列出的版本时更新。

我遇到的问题是从注册表项获取值到IF值的最佳方法是什么。

我在Google上看了一下,找不到符合我想要的东西。

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

这是我被困的地方。如何使用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语句。为我的愚蠢提前道歉。

2 个答案:

答案 0 :(得分:0)

您的脚本存在的一个具体问题是,您在这一行中获得了额外的&&

IF NOT Version==12.5.4.42 && goto install

暂时rem暂停@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)

要回答您问的问题,如何捕获reg或任何其他命令的输出,请使用for /F循环。有关详细信息,请参阅cmd控制台中的for /?

答案 1 :(得分:-1)

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

字符串Version永远不会等于字符串12.5.4.42。您需要Version内容,因此代码应为

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

(单个&连接命令)

以下if是多余的。要达到该声明,版本必须不是-12.5.4.42否则执行将转移到:end

BTW,goto :eof :eof中的冒号必需表示&#39;转到物理文件结尾&#39;。