2017-01-05 1 views
2

iTunes 버전을 확인한 배치 파일을 만든 다음 버전이 스크립트에 나열된 버전보다 낮은 경우 업데이트합니다.버전에 따라 iTunes를 업데이트하는 일괄 파일

내가 갖고있는 문제는 레지스트리 키 값을 내 IF 값으로 가져 오는 가장 좋은 방법입니다.

나는 Google에서 조금 둘러 보았고 내가하고 싶은 것과 일치하는 것을 찾을 수 없다.

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

이것은 내가 갇혀있는 곳입니다. 버전의 값은 어떻게 사용합니까? 이를 위해 FOR 루프를 사용해야합니까? 나는 내가이 알아 낸 얻을 수있는 도구 같은 느낌 스와

::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) 

하지만, reg의 출력 또는 다른 명령을 캡처하는 방법하는 for /F 루프를 사용, 당신이 묻는 질문에 대답합니다. 자세한 내용은 cmd console의 for /?을 참조하십시오.

+0

재미있는 방법. 내가 시험해보고 무슨 일이 일어나는 지 보자 !!!!! – Kellanist

+0

iTunes가 설치되어 있지 않거나 버전이 나열된 버전보다 낮은 경우 iTunes를 설치하려면 가장 좋은 방법은 무엇입니까? – Kellanist

+0

@Kellanist 내 솔루션은 이미 그것을 (나는) 생각합니다. PowerShell에서 'exit 1'을 실행하면 실행 스레드가 배치 스크립트로 돌아갑니다. PowerShell이 ​​errorlevel 1로 종료되면,'&&'는 생략되고': install'에서 실행이 계속됩니다. 그건 그렇고, 스택 오버플로에 오신 것을 환영합니다! 저의 답이 도움이 되었다면 그것을 받아 들인 것으로 간주하십시오. [이것이이 페이지를 참조하십시오] (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 동일하게 진행되지 않습니다. 당신은 내용을 Version을 필요로하기 때문에 코드는

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

(단일 &을 병합 명령)

다음 if은 불필요해야한다. 해당 진술에 도달하려면 버전 이 아니어야합니다 (12.5.4).:eof에서 콜론 은 '물리적 파일의 끝으로 이동'을 의미을 요구되는 42 그렇지 않으면 실행이 :end BTW

, goto :eof로 전송되었을 것입니다.

관련 문제