Aqui está um script do PowerShell que eu escrevi e que deve fazer o que você precisa.
Eu peguei a lógica deste tópico: link e transformou-o em um script que você pode executar como uma tarefa agendada no Windows.
Você precisará ter o .net4.0 e o PowerShell 3.0 instalados para usá-lo, caso contrário, você terá erros. Neste ponto, você provavelmente terá .net4.0, mas provavelmente precisará do PowerShell 3.0
Salve o seguinte em um arquivo chamado thumb_generate.ps1
param ([string]$path,[string]$ext)
function Refresh-Explorer
{
$code = @'
[System.Runtime.InteropServices.DllImport("Shell32.dll")]
public static extern Int32 SHParseDisplayName([MarshalAs(UnmanagedType.LPWStr)] String pszName, IntPtr pbc, out IntPtr ppidl, UInt32 sfgaoIn, out UInt32 psfgaoOut);
[System.Runtime.InteropServices.DllImport("Shell32.dll")]
private static extern int SHChangeNotify(int eventId, int flags, IntPtr item1, IntPtr item2);
[System.Runtime.InteropServices.DllImport("Shell32.dll")]
private static extern int ILFree(IntPtr pidl);
public static void Refresh(string path) {
uint iAttribute;
IntPtr pidl;
SHParseDisplayName(path, IntPtr.Zero, out pidl, 0, out iAttribute);
SHChangeNotify(0x00002000, 0x1000, IntPtr.Zero, IntPtr.Zero);
ILFree(pidl);
}
'@
Add-Type -MemberDefinition $code -Namespace MyWinAPI -Name Explorer
[MyWinAPI.Explorer]::Refresh($path)
}
cls
if([System.String]::IsNullOrEmpty($path))
{
Write-Host "Path cannot be empty."
Write-Host "Example: .\thumb_generate.ps1 -path ""C:\"" -ext ""jpg"""
return
}
if([System.String]::IsNullOrEmpty($path))
{
Write-Host "Extension cannot be empty."
Write-Host "Example: .\thumb_generate.ps1 -path ""C:\"" -ext ""jpg"""
return
}
$fileExtension = "*." + $ext
Write-Host -ForegroundColor Green "---Thumbnail generation for Windows 7/8---"
Write-Host -ForegroundColor Green "----PowerShell 3.0 & .Net 4.0 required----"
Write-Host "Path: " $path
Write-Host "Extension: " $fileExtension
Write-Host
if (Test-Path $path)
{
Write-Host "Path Exists, begin generation thumbnails"
$images = [System.IO.Directory]::EnumerateFiles($path,$fileExtension,"AllDirectories")
Foreach($image in $images)
{
try
{
$file = New-Object System.IO.FileInfo($image)
Write-Host $file.FullName
$fStream = $file.Open([System.IO.FileMode]::Open,[System.IO.FileAccess]::Read,[System.IO.FileShare]::None)
$firstbyte = New-Object Byte[] 1
$result = $fStream.Read($firstbyte,0,1)
}
catch
{
Write-Host -ForegroundColor Red "An error occured on file: " + $file.FullName
}
$fStream.Close();
}
Refresh-Explorer
}
else
{
"Path Doesn't Exist, Exiting..."
}
Em seguida, execute-o a partir da linha de comando do PowerShell com os seguintes parâmetros:
.\thumb_generate.ps1 -path "C:\PathToImages\" -ext "jpg"
Na realidade, qualquer extensão de arquivo deve funcionar. Ele irá olhar recursivamente através de todos os diretórios. A única desvantagem é apenas um tipo de arquivo de cada vez, mas várias tarefas podem ser executadas usando simplesmente uma extensão de arquivo diferente. Basicamente, o script abre cada arquivo e lê apenas o primeiro byte, o que é suficiente para forçar uma atualização no arquivo thumbs.db.
Editar Eu alterei o script para incluir também a parte de atualização do shell postada acima. Parece estar funcionando no meu sistema, embora eu não tenha milhares de imagens para testar. Isso combina a leitura dos primeiros bytes do arquivo, seguida de uma atualização das miniaturas.