Offline files и как с ними бороться

Небольшая заметка для тех, кто, как и я, использует offline files в Windows XP. Штука эта достаточно капризная. Если вы замечаете, что что-то «сломалось» в offline files и у вас нет ни времени, ни желания разбираться, почему оно ведет себя как-то не так, как должно, существует простой способ лечения. Выглядит он почти, как лечение головной боли при помощи гильотины, но зато этот способ так же эффективен и быстр: вы можете переинициализировать кэш и базу данных автономных файлов на проблемной рабочей станции. Естественно, что прежде, чем прибегнуть к столь радикальному средству, необходимо убедиться, что кэш автономных фалов не содержит файлов, которые не синхронизированы с  сетевым ресурсом.

Если по каким-то причинам  произошло страшное, и кэш автономных фалов – единственное хранилище, содержащее уникальные версии файлов, которые вам надо каким-то образом из него выгрузить, то на помощь вам придет утилита для работы с автономными файлами: CSCCMD (Client-Side Caching Command-Line Options). Замечу, что для этого вам потребуется CSCCMD именно версии 1.1, о которой речь идет в статье и, которая, почему-то не находится в свободном доступе (вам придется запрашивать ее в Microsoft).

Ну и наконец, не так давно наткнулся  на следующую неприятную ситуацию: у некоторых пользователей компьютер все время сваливался в  автономный режим, при этом среди объектов, подлежащих синхронизации, присутствовала сетевая папка, расположенная на сервере, который был выведен из эксплуатации (т.е. давно уже прекратил свое существование). Но, в то же самое время, если заглянуть в папку автономных файлов при помощи оснастки «Свойства папки», то среди перечня файлов, находящихся в кэше, не удавалось обнаружить ни одного файла, который бы располагался на этом (давно уже не существующем) сетевом ресурсе. Поначалу, я тупо выполнял инициализацию кэша, пока не понял, что в данном случае этот метод помогает, но не надолго. Тогда я таки решил приложить мозг и попытаться понять, как такое может быть: ни одного файла с проблемного сетевого ресурса в кэше нет, но сам этот фантомный ресурс регулярно появляется в окне «Параметры синхронизации»? Объяснение этому я придумал только одно, и оно подтвердилось: путь к несуществующему сетевому ресурсу содержался в ярлыках (файлах с расширением .lnk), которые вместе с прочими файлами хранились в сетевых папках подлежащих кэшированию при помощи OfflineFiles. В связи с этим встала задачка: обнаружить все ярлыки, которые бы содержали ссылку на этот сетевой ресурс. Для чего и был рожден следующий «лирический и нежный» скрипт:

<#
	ShortCutCheck.ps1 PowerShell shs 20100520

	ShortCutCheck.ps1 <What2Find> [Directory2Check]

.SYNOPSIS
	Выполняет проверку содержимого ярлыков на соответствие regex-шаблону

.Параметр What2Find
	regex-шаблон

.Параметр Directory2Check
	Одна или несколько директорий, в которых будет произведен поиск ярлыков

.Описание
	Этот скрипт предназначен для поиска ярлыков, чьи поля TargetPath или
	WorkingDirectory соответствуют regex-шаблону, заданному параметром What2Find
	Скрипт находит все ярлыки в папке или папках (а так же в любых их подпапках),
	заданных параметром Directory2Check. Если параметер Directory2Check не был задан
	при запуске скрипта, то поиск будет производится на "Рабочем столе" и в "Моих документах"
	текущего пользователя. Затем скрипт проверит на соответствие шаблону 2 поля каждого ярлыка:
	TargetPath и WorkingDirectory. Если содержимое этих полей соответствует шаблону What2Find,
	то на экран будет выведено соответствующее сообщение

.Пример
	.\ShortCutsCheck.ps1 -What2Find .*terminal.* -Directory2Check H:\users
#>
param ($What2Find, $Directory2Check)
###############################################################################
#
# Function Show-Help. Write  first blok comment of this script to the host
#
Function Show-Help ($ScriptFullName){
   if ($ScriptFullName) {
       $IsHelpLine=$false
       switch -file $ScriptFullName {
           {$_ -match "<#"}     {Write-Host $_;$IsHelpLine=$true;continue}
           {$_ -match "#>"}     {Write-Host $_;$IsHelpLine=$false;break}
           {$IsHelpLine}        {Write-Host $_;}
       }
   }
}
###############################################################################
cls
#Вкл/выкл отладочных сообщений
$VerbosePreference="SilentlyContinue"#"Continue"
if ($What2Find) {
	#Если $Directory2Check не передали в качестве параметра, то поиск будет происходить
	#на "Рабочем столе" польльзователя и папке "Мои документы"
	if (!$Directory2Check) {
		$DesktopDirectory=[System.Environment]::GetFolderPath('DesktopDirectory')
		$Personal=[System.Environment]::GetFolderPath('Personal')
		$Directory2Check=@($DesktopDirectory,$Personal)
	}
	#
	#Создаем COM-объект Shell для доступа к свойствам ярлыков
	$Shell = New-Object -COM WScript.Shell
	#Рекурсивно получим перечень всех файлов с расширением *.lnk, находящихся в папках $Directory2Check
	$Directory2Check| dir -Recurse -Force -Filter *.lnk | select -ExpandProperty FullName | foreach{
		#Сохраним в переменной объект для текущего файла .lnk
		$Shortcut = $Shell.CreateShortcut($_)
		Write-Verbose "ShortCut full name`t:`t$_"
		Write-Verbose "ShortCut target path`t:`t$($Shortcut.TargetPath)"
		Write-Verbose "Shortcut Working Directory`t:`t$($Shortcut.WorkingDirectory)"
		#Если TargetPath соответствует заданой маске - информируем пользователя
		if ($Shortcut.TargetPath -match $What2Find) {
			Write-Host "Найдено совпадение для шаблона `"$What2Find`" в ShortCut.TargetPath= $($Shortcut.TargetPath)"
			Write-Host "Ярлык= $_`n" -ForegroundColor Green
		}
		#Если WorkingDirectory соответствует заданой маске - информируем пользователя
		if ($Shortcut.WorkingDirectory -match $What2Find) {
			Write-Host "Найдено совпадение для шаблона `"$What2Find`" в ShortCut.WorkingDirectory= $($Shortcut.WorkingDirectory)"
			Write-Host "Ярлык= $_`n" -ForegroundColor Green
		}
	}
}
else {
	Write-Host "Ошибка! Не задан обязательный параметр What2Find"
	#Write top block comment as help
	Show-Help $MyInvocation.MyCommand.Path
}

PS пока искал информацию по теме, наткнулся на очень полезный блог разработчиков: The Storage Team at Microsoft – File Cabinet Blog, было интересно узнать, что, начиная с Vista, ситуация с Offline Files начала меняться к лучшему, о чем вы можете почитать в следующей статье: Offline Files in Windows Vista (в частности для работы с кэшем OfflineFiles теперь нужно использовать WMI (а, значит, нет необходимости во внешних утилитах, типа CSCCMD), переход в офлайн выполняется не для корня всего сетевого ресурса целиком, но только для конкретной «шары» и т.п)

Leave a Reply

Your email address will not be published. Required fields are marked *

Notify me of followup comments via e-mail. You can also subscribe without commenting.