尝试创建将检查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语句。为我的愚蠢提前道歉。
答案 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;。