Вот сценарий PowerShell, который я написал, который должен делать то, что вам нужно.
Я взял логику из этой темы: https://stackoverflow.com/questions/3555799/how-do-i-refresh-a-files-thumbnail-in-windows-explorer и превратил ее в скрипт, который можно запустить как запланированное задание в windows.
Для его использования вам потребуется установить .net4.0 и PowerShell 3.0, иначе у вас будут ошибки. На данный момент у вас, вероятно, есть .net4.0, но вам, вероятно, понадобится PowerShell 3.0
Сохраните следующее в файл с именем 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..."
}
Затем выполните его из командной строки PowerShell со следующими параметрами:
.\thumb_generate.ps1 -path "C:\PathToImages\" -ext "jpg"
На самом деле, любое расширение файла должно работать. Он будет рекурсивно просматривать все каталоги. Один недостаток - это только один тип файла одновременно, но можно запустить несколько заданий, которые просто используют другое расширение файла. По сути, скрипт открывает каждый файл и читает только первый байт, что достаточно для принудительного обновления файла thumbs.db.
Редактировать Я изменил скрипт, чтобы включить часть обновления оболочки, опубликованную выше. Кажется, он работает в моей системе, хотя у меня нет тысяч изображений для тестирования. Это объединяет чтение первых нескольких байтов файла с последующим принудительным обновлением миниатюр.