Como a questão menciona um arquivo .exe, presumo que você esteja no Windows. Se assim for, você pode fazer isso com o PowerShell.
O script
# Set some variables to hold the source, name and destination of the update file
$UpdateUrl = "http://example.com/"
$UpdateFile = "update.zip"
$Destination = "C:\Path\to\application\"
$TempDir = $Env:Temp + "\"
# Download the update file to a temporary directory
$Client = New-Object System.Net.WebClient
$Client.DownloadFile($UpdateUrl + $UpdateFile, $TempDir + $UpdateFile)
# Calculate MD5 hash of the downloaded update file
$MD5 = New-Object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider
$Hash1 = [System.BitConverter]::ToString(
$MD5.ComputeHash([System.IO.File]::ReadAllBytes($TempDir + $UpdateFile))
)
# If an old update file exists at the destination, calculate its MD5 hash as well
If (Test-Path ($Destination + $UpdateFile)) {
$Hash2 = [System.BitConverter]::ToString(
$MD5.ComputeHash([System.IO.File]::ReadAllBytes($Destination + $UpdateFile))
)
} Else {
$Hash2 = ""
}
# Compare the MD5 hashes
# If they're not equal, then copy the new update file to the destination and extract its contents
If ($Hash1 -ne $Hash2) {
Copy-Item ($TempDir + $UpdateFile) $Destination
$Shell = New-Object -ComObject Shell.Application
$Shell.NameSpace($Destination).CopyHere(
$Shell.NameSpace($Destination + $UpdateFile).Items(),
20
)
}
# Delete the downloaded update file
Remove-Item ($TempDir + $UpdateFile)
Explicação
O primeiro bloco declara algumas variáveis que contêm o nome, a origem e o destino do arquivo de atualização, bem como um diretório temporário para conter o arquivo de atualização baixado. Não se esqueça das barras à direita quando você as altera para seus próprios caminhos.
O próximo bloco usa o objeto WebClient para baixar o arquivo para o diretório temporário.
Em seguida, o script calcula o hash MD5 do arquivo baixado. Se você quiser calcular um hash diferente, como SHA-1, confira as classes disponíveis no System.Security Namespace de criptografia .
Em seguida, o script verifica a existência de um arquivo de atualização antigo na pasta de destino e calcula seu hash MD5.
Em seguida, os dois hashes são comparados. Se eles não são iguais, significa que houve uma atualização. O script usa o objeto Shell do Windows para copiar o arquivo de atualização para a pasta de destino e extrair seu conteúdo. O número 20 é a soma de duas opções da função CopyHere () - 4 (que suprime o diálogo de progresso) e 16 (que responde "Yes to All" a qualquer diálogo, sobrescrevendo automaticamente os arquivos existentes).
Por fim, a última linha exclui o arquivo de atualização baixado do diretório temporário.
Referências
Para mais informações sobre as classes, métodos e cmdlets usados, consulte os seguintes links:
- Criando objetos .NET e COM (New-Object)
- Classe de cliente da Web
- Como obter uma soma de verificação MD5 no powershell
- Classe MD5CryptoServiceProvider
- Método File.ReadAllBytes
- Usando o cmdlet Test-Path
- Usando o cmdlet Copy-Item
- Objeto do shell (Windows)
- Método Folder.CopyHere (Windows)
- Usando o cmdlet Remove-Item