Несмотря на то, что стоимость устройств хранения все время снижается, ненужная сохраняемая информация приводит к другим скрытым и явным затратам. Для управления данными важно, чтобы стоимость хранения была невысокой, особенно если речь идет о хранении старых файлов или файлов, не относящихся к основному рабочему процессу. Такие файлы с информацией типа фотографий и резюме служащих, резервные заказы, файлы игр и полное резервирование пользовательского диска, по-видимому, не следует хранить на сервере. Многие компании не хранят такие файлы, которые хранятся на индивидуальных жестких дисках пользователей персональных компьютеров и не хотят выделять полезную площадь хранения и ресурсы архивирования для файлов, которые не имеют отношения к деятельности компании.

Я написал три сценария для очистки данных, которыми можно пользоваться при выполнении работы. Сценарий DeleteFilesByExtension.bat уничтожает файлы по расширению, сценарий DeleteOlderFiles.bat уничтожает файлы со сроком хранения больше заданного, а сценарий DeleteLargeFiles.bat уничтожает файлы, размер которых превышает установленный порог. Эти сценарии будут рассмотрены ниже, но сначала я дам краткий обзор затрат, которых можно избежать с помощью регулярной очистки системы хранения.

Очевидно, что сценарии, предназначенные для уничтожения файлов, нужно применять со всей предосторожностью, поскольку они могут нанести непоправимый ущерб. Для уменьшения риска из-за ошибочного использования этих и других сценариев посмотрите врезку "Безопасное применение сценариев".

Затраты на хранение данных

Как правило, в папке My Documents в на хранятся текстовые документы, старые версии, текущие работы, а также давно не используемые файлы. Даже на своем собственном компьютере я трачу несколько минут, чтобы отсортировать ненужные файлы и найти правильную версию файла. Если искать файл в общей папке на удалённом компьютере, на котором находится 80% старых и ненужных файлов других пользователей, то поиск нужного файла будет трудной задачей, поскольку избыточные файлы будут мешать быстрому поиску нужной информации. Конечно, дисковая память не слушком дорога, но объем ненужных файлов приводит к увеличению времени поиска данных и еще возникает риск получения ошибочной версии файла.

Дополнительные расходы по хранению связаны со сканированием на наличие вирусов, стоимостью подключения пользователя к серверу или смене систем хранения, и, кроме того, увеличиваются общие затраты на хранение данных (например, замена неисправных дисков, архивных лент и оборудования, площадей, питания, оборудования климатконтроля для систем хранения) - все это приводит к увеличению используемого пространства. В случае восстановления в аварийных ситуациях время, а следовательно и затраты, на частичное или полное восстановление данных непосредственно связаны с количеством данных, содержащихся в системе. С увеличением количества данных время восстановления данных возрастает. Если еще учесть, что пользователи часто не помнят полного имени или пути к местоположению восстанавливаемого файла, то время, затраченное на поиск правильного файла, увеличивает издержки, связанные с восстановлением файлов.

Отделяем посторонние файлы

В любой структуре данных существует три вида файлов: файлы, совершенно не относящиеся к делу, файлы, имеющие отношение к делу и файлы, статус которых нельзя определить без их открытия. Сценарии данной статьи полезнее всего для файлов, совершенно не относящихся к делу. Характеристики таких файлов сильно варьируются в зависимости от вашей корпоративной среды.

Самое большое количество посторонних файлов, не имеющих отношения к делу, с которыми я в последнее время сталкивался, были музыкальные файлы в формате MP3. Многие пользователи хранят музыкальные файлы на рабочих персональных компьютерах и, несмотря на политики, направленные против сохранения файлов MP3 на серверах, иногда все же файлы MP3 каким-то образом оказываются на серверах. Если у вас много сотрудников, то можно с уверенностью сказать, что вы сохраняете, как минимум, несколько, а возможно, и много таких файлов. Кроме очевидных вопросов по использованию общей пропускной способности для загрузки музыкальных файлов, файлы MP3 могут занимать большой объем памяти. Поскольку в моей компании не используют формат MP3 для хранения звуковых файлов компании, они исключаются автоматически.

Другую группу таких файлов образуют исполняемые файлы с расширениями .exe, .com, .bat и .scr. Например, я постоянно слежу за конфигурацией всех настольных персональных компьютеров, а установка неразрешенного программного обеспечения не соответствует корпоративной политике, но несмотря ни на что иногда такие программы все же просачиваются на общие каталоги хранения, поэтому их надо исключать. Уничтожение исполняемых файлов не только экономит память и уменьшает помехи, но и уменьшает риск, что в безвредных на первый взгляд файлах (например, открытки, игры) содержатся опасные компоненты (например, вирусы). Я выделяю на серверах и персональных компьютерах специальную область для хранения исполняемых файлов, применяемых для административных задач, и эти области не подвергаются автоматическому исключению.

Перед уничтожением файлов надо согласовать с администраторами и пользователями типы файлов, которые безусловно не соответствуют корпоративным интересам. Необходимо пользоваться обратной связью с пользователями на тот случай, когда в качестве разрешенных в компании начинают применяться новые типы файлов. Например, предположим, вы обнаруживаете несколько медиа файлов формата MPEG (Moving Pictures Experts Group) на сервере, содержащем рабочие файлы и другие видео файлы, которыми ваши пользователи любят обмениваться. По согласованию с администрацией, вы узнаете, что компания не использует неизвестные коммерческие MPEG файлы. В таком случае можно выполнять сценарий, который регулярно удаляет такие файлы. Если потом производственный отдел начинает применять файлы в стандарте MPEG для документирования производственных процедур и производства учебных видео файлов, то может возникнуть критическая ситуация при удалении необходимых деловых файлов. Вот почему является обязательным регулярное взаимодействие с пользователями по согласованию типов файлов для автоматического удаления.

Если все же есть небольшая группа пользователей, которые используют типы файлов, предназначенные для автоматического удаления, то для них можно выделить специальные области хранения, которые не подвергаются действию сценариев автоматического удаления. Если вы беспокоитесь, что случайно могут быть исключены нужные файлы, то можно организовать запуск сценариев только после регулярного копирования. При таком подходе на резервирование ненужных файлов используются ресурсы, но исключается ситуация, когда может оказаться уничтоженной важная информация (скажем, отпускные фотографии руководства) и нет невозможности ее восстановления.

Если общие папки содержат файлы с необычными расширениями, то надо определить, какой тип файлов связан с этим расширением. Эти определения можно найти на следующих сайтах:

Исключение посторонних файлов

Есть несколько методов исключения файлов по расширению. Мои сценарии для исключения файлов основаны на утилите ForFiles, которая включена в наборы Resource Kit операционной системы Windows 2000 и более поздних версий операционной системы.

Основной синтаксис утилиты ForFile:

forfiles -p path -s -m -c command

где path - это путь, используемый для начала поиска, command - команда, которую ForFiles будет выполнять над каждым файлом, который удовлетворяет критериям поиска. Ключ -p обрабатывает путь, а ключ -c обрабатывает команду. Ключ -s говорит, что утилита ForFiles должна включать подкаталоги в зону поиска. Ключ -m позволит задать типы файлов для поиска. Значение по умолчанию *.* этого ключа определяет файлы всех типов, кроме особых расширений сценария DeleteFilesByExtension.bat. Хотя ForFiles в этой статье записывается на нескольких строках, вся команда должна быть введена на одной строке, если вы запускаете ее в командном окне.

Единственные ограничения утилиты ForFiles заключается в том, что лучше она работает на локальной системе. Если вы используете ее для удаленного каталога общего доступа, учтите, что она не поддерживает имена, соответствующие соглашению UNC (Universal Naming Convention). Надо назначить диску букву для использования ForFiles в случае удаленного размещения каталога, и по соображениям эффективности лучше запускать инструмент на локальной машине, где хранятся данные. Это позволит также избежать конфликтных ситуаций по ограничениям UNC. Более подробно о ключах ForFiles и возможностях его применения см. в http://www.microsoft.com/technet/prodtechnol/windowsserver2003/ library/serverhelp/9660fea1-65c7-48cf-b466-204ba159381e.mspx, или можно ввести

ForFiles -?

для просмотра интерактивной подсказки. Общий синтаксис /? для интерактивной помощи не годится для ForFiles.

Листинг 1 показывает код сценария DeleteFilesByExtension.bat. Как видно, команда ForFiles находится внутри цикла команды For, чтобы сценарий мог находить и уничтожать нужное количество файлов. Обратите внимание, что надо заключить команды, содержащие пробелы в двойные кавычки. Все сценарии в этой статье содержат фрагмент настройки пути к утилите ForFiles.

Исключение файлов по сроку их хранения

Исключение файлов по сроку их хранения и по расширению представляет собой другой путь для уменьшения мусора при работе с файлами. В моей компании отведено место для файлов общего пользования, которыми пользователи обмениваются. Сначала в этом месте планировалось хранить папки с файлами, предназначенными для общей работы: пользователи могли держать там общие файлы, они могли читать их или изменять. По начальным соображениям, пользователи сами должны были уничтожать копию на сервере в месте общего хранения. Но пользователи, как правило, забывали уничтожать ненужные файлы, поэтому область, отведенная для общего пользования, превратилась в огромную неуправляемую свалку. Через два месяца мы вынуждены были начать уничтожение файлов.

В сценарии DeleteOlderFiles.bat, который помещен в Листинг 2, снова используется инструмент ForFiles, на этот раз с ключом по дате, который проверяет возраст файла. Ключ -d позволяет определять возраст или диапазон возраста файлов, который мы выделяем. Например, ключ -d-60 дает команду, по которой ForFiles ищет файлы, возраст которых больше или равен 60 дням.

Уничтожение файлов по размеру

В некоторых ситуациях может потребоваться уничтожение файлов по размеру и по расширению. Например, моя компания применяет медиа файлы формата MPEG для дела. Недавно были обнаружены очень большие персональные файлы формата MPEG (больше 25Мбайт). Они определенно не соответствовали интересам компании.

Для таких случаев я написал сценарий DeleteLargeFiles.bat, он показан в Листинг 3. Этот сценарий включает переменную, определяющую размер файла @FSIZE в команде Del для ее реализации, как показывает метка A. Переменная @FSIZE ищет файлы определенного размера — в этом случае, файлы, размер которых превышает 26 214 400 байт (25Мбайт). Переменная @FSIZE утилиты ForFile должна быть задана в байтах, убедитесь, что это так, чтобы исключить только те файлы, которые вы хотите удалить.

Применение сценариев в вашей среде

Каждый сценарий содержит комментарии, как настроить сценарий для конкретной среды. Обратите внимание на следующие пункты:

  • В пути к утилите не должно быть пробелов.
  • Утилита ForFiles поддерживает только локальные пути, то есть для сетевых дисков нельзя указывать путь UNC, а необходимо присвоить сетевому диску букву диска.
  • Проверьте сценарии в режиме List, запустив их без параметров, проверьте тщательно созданный журнал прежде, чем начнете работу сценария в режиме уничтожения Delete.
  • Если вам нужно запускать сценарии периодически, можно применить Task Scheduler для запуска сценариев с необходимой частотой.

Минимизация лишних файлов в папках коллективного пользования - это постоянно существующая задача. Сценарии DeleteFilesByExtension.bat, DeleteOlderFiles.bat и DeleteLargeFiles.bat помогут вам сэкономить время и деньги.


Листинг 1. DeleteFilesByExtension.bat
:: BEGIN COMMENT
:: Установите соответственно местонахождение инструмента ForFiles,
 папки для поиска и папки системного журнала.
:: END COMMENT
Set ForFilesLoc=D:DataArchivingScriptsforfiles.exe
Set SearchLoc=R:Testfolder
Set LogLocDir=D:DataArchivingScripts

:: BEGIN COMMENT :: Установите расширения файлов, предназначенные для уничтожения. Поддерживаются единичные и множественные цели. Разделяйте пробелами или запятыми. :: END COMMENT Set FileExts=MP3,EXE
If /I "%1"=="del" Goto :DelFiles Goto :ListFiles
:DelFiles Echo Запуск в режиме удаления - выполняется удаление файла For /D %%i in (%FileExts%) Do %ForFilesLoc% -p"%SearchLoc%" Â-s -m*.%%i -c"Cmd /C Del /Q 0x22@PATH@FILE0x22&Echo @PATH@FILE" >>"%LogLocDir%\%%i-DelLog.txt" Goto :EOF
:ListFiles Echo Запуск в режиме вывода списка файлов, удаление производиться не будет. Echo Для выполнения удаления используйте синтаксис: Echo DeleteFilesByExtension.bat Del For /D %%i in (%FileExts%) Do %ForFilesLoc% -p"%SearchLoc%" -s -m*.%%i -c"Cmd /C Echo @PATH@FILE" >>"%LogLocDir%\%%i-ListLog.txt" Goto :EOF

Листинг 2. DeleteOlderFiles.bat
:: BEGIN COMMENT
:: Установите местонахождение инструмента ForFiles, папки
 для поиска и папки с системным журналом, соответственно.
:: END COMMENT
Set ForFilesLoc=D:DataArchivingScriptsforfiles.exe
Set SearchLoc=R:Testfolder
Set LogLocDir=D:DataArchivingScripts

:: BEGIN COMMENT :: Установите порог для уничтожения файлов по одному из способов (например, :: 60, 365) или в качестве даты в прошлом по формату ММДДГГГГ, где ММ-месяц, ДД-день, ГГГГ -год (например, 01011993). :: END COMMENT Set DaysThr=365
If /I "%1"=="del" Goto :DelFiles Goto :ListFiles
:DelFiles Echo Running in Delete Mode - Deletions in progress %ForFilesLoc% -p"%SearchLoc%" -s -m*.* -d-%DaysThr% -c"Cmd /C Del /Q 0x22@PATH@FILE0x22&Echo @PATH@FILE" >>"%LogLocDir%DateDelLog.txt" Goto :EOF
:ListFiles Echo Running in List Mode - no deletions Echo To run this script and actually perform deletions, use syntax: DeleteOlderFiles.bat Del %ForFilesLoc% -p"%SearchLoc%" -s -m*.* -d-%DaysThr% -c"Cmd /C Echo @PATH@FILE">>"%LogLocDir%DateListLog.txt" Goto :EOF

Листинг 3. DeleteLargeFiles.bat
:: BEGIN COMMENT
:: Установите местонахождение инструмента ForFiles,
 папки для поиска и папки с системным журналом, соответственно.
:: END COMMENT
Set ForFilesLoc=D:DataArchivingScriptsforfiles.exe
Set SearchLoc=R:Testfolder
Set LogLocDir=D:DataArchivingScripts

:: BEGIN COMMENT :: Установите порог размера файлов в байтах :: END COMMENT Set SizeThr=26214400
:: BEGIN COMMENT :: Установите расширения файлов, предназначенные для уничтожения. Поддерживаются единственное расширение. :: Для уничтожения всех файлов укажите звездочку (*). :: END COMMENT Set FileExt=MPEG
If /I "%1"=="del" Goto :DelFiles Goto :ListFiles
:DelFiles Echo Запуск в режиме Delete - Уничтожаются [BEGIN CALLOUT A] %ForFilesLoc% -p"%SearchLoc%" -s -m*.%FileExt% -c"Cmd /C If @FSIZE GTR %SizeThr% Del /Q 0x22@PATH@FILE0x22&Echo @FSIZE,@PATH@FILE">> "%LogLocDir%SizeDelLog.csv" [END CALLOUT A] Goto :EOF
:ListFiles Echo Running in List Mode - no deletions Echo To run this script and actually perform deletions, use syntax: DeleteLargeFiles.bat Del %ForFilesLoc% -p"%SearchLoc%" -s -m*.%FileExt% -c"Cmd /C If @FSIZE GTR %SizeThr% Echo @FSIZE,@PATH@FILE" >>"%LogLocDir%SizeDelLog.csv" Goto :EOF

Листинг 4. Код для проверки правильных значений параметров среды.
:: BEGIN COMMENT
:: Проверка имени компьютера. Заменить каждый
 случай Node1 именем узла, на котором 
:: должен работать сценарий.
:: END COMMENT
If /I "%COMPUTERNAME%"=="Node1"
 Goto :RunScript
Echo Script needs to be run on Node1&Echo Exiting
 Script Now!&Pause&Goto :EOF
:RunScript

:: BEGIN COMMENT :: Проверка имени пользователя Username. Заменить каждый случай rlewis на :: имя пользователя который имеет право запускать этот сценарий. :: END COMMENT If /I "%USERNAME%"=="rlewis" Goto :RunScript Echo Script needs to be run by user rlewis&Echo Exiting Script Now!&Pause&Goto :EOF :RunScript
:: BEGIN COMMENT :: Проверка даты. Заменить каждый случай даты Sat 03/19/2005 :: датой запуска сценария в аналогичном формате. :: END COMMENT If /I "%DATE%"=="Sat 03/19/2005" Goto :RunScript Echo Script intended to be run only on Sat 03/19/2005&Echo Exiting Script Now!&Pause&Goto :EOF :RunScript
:: BEGIN COMMENT :: Пример того, как применить сцепленный оператор, объединяющий несколько :: команд If. :: END COMMENT If /I "%COMPUTERNAME%"=="Node1" If /I "%USERNAME%"=="rlewis" If /I "%USERDOMAIN%"=="sales" If /I "%DATE%"=="Sat 03/19/2005" Goto :RunScript Echo Script has multiple run conditions, at least one of which is failing!&Echo Exiting Script Now!&Pause&Goto :EOF :RunScript

Безопасное применение сценариев

Хороший сценарий может сократить выполнение задания, сберегая минуты, а иногда часы вашего времени. Но с другой стороны, разработчик сценария боится, что выполнение сценария может привести к плохим последствиям из-за многих причин. Сценарий может быть выполнен, например, на другом компьютере, не тем пользователем, с ошибочными параметрами или в неположенное время. Могут произойти нежелательные изменения до того, как вы осознаете свою ошибку. Если написанный сценарий выполняет запросы или создает сообщения, то случайный запуск сценария может привести к неправильному или нежелательному результату. Но если сценарий вносит изменения или выполняет уничтожение, как это делают мои сценарии, то случайный двойной щелчок мог бы привести к печальным последствиям. Вот несколько советов для выполнения таких сценариев в более безопасном режиме.

Проверьте переменные среды

Как то, когда я был младшим системным администратором и новичком в применении сценариев, я запустил сценарий не на том компьютере. Старший администратор, посмотрев через мое плечо, увидел ошибку и прервал выполнение сценария. К счастью, моя ошибка не успела ничего испортить. Урок пошел мне на пользу, и я стал учитывать возможную непоправимость последствий.

Если вы хотите предупредить ошибки такого рода: случайные запуски на неправильном компьютере, несанкционированным пользователем, ошибочное время исполнения, то добавьте соответствующие фрагменты из Листинга 4 в начале вашего сценария. Листинг 4 включает код для проверки компьютера, имени пользователя и даты и прекращает сценарий, если обнаруживаются неправильные переменные среды. При несанкционированном запуске сценария в таких случаях, происходит завершение работы сценария. Очевидно, эта мера предосторожности не помешает другому администратору модифицировать код для запуска сценария с другими параметрами среды (другие узлы и пользователи), но она может исключить много возможных неприятных инцидентов.

Проверьте параметры

Другой способ предупреждения случайного запуска сценария представляет собой применение безопасного режима работы сценария в состоянии по умолчанию. Если сценарий при запуске не находит правильного параметра, то сценарий выдает предупреждение или по умолчанию, если это подходит, переходит в режим вывода списка.

Я использую последний метод в сценариях DeleteFilesByExtension.bat, DeleteOlderFiles.bat и DeleteLargeFiles.bat. Сценарии выполняются в режиме вывода списка по умолчанию. В этом режиме сценарии сообщают о том, что будет удалено, если они заработают в режиме удаления, но они не выполняют никакого реального удаления. Если сценарий обнаруживает правильное значение параметра, то сценарий переключается в режим удаления и производит эти удаления. Эта мера предосторожности аннулирует случайные двойные щелчки или запуски сценариев.

Переименование сценария

Как и многие авторы сценариев, я люблю сохранять всу свои написанные сценарии для использования отлаженных фрагментов кода в будущих сценариях. Это, однако, также приводит к ошибкам случайного запуска сценария в результате неверного двойного щечка при редактировании или просмотре кода.

Если сценарий написан только для однократного применения, то для эффективной его блокировки его можно переименовать сразу после его применения. Для этого добавьте к концу сценария фрагмент:

Move "%0" "%0.txt"

Этот код переименовывает сценарий после его запуска добавлением текстового расширения .txt. В переименованном виде сценарий находится в неисполняемом состоянии и в то же время его можно отыскать по имени с помощью поисковых средств Windows или другой утилиты поиска.

Убедитесь, что этот метод выдаст обычное сообщение "The batch file cannot be found" (командный файл не найден), поскольку сценарий уже переименован и его нет там, где Windows ожидает его увидеть после его запуска. Это сообщение об ошибке не указывает на то, что есть какая-то проблема, оно позволяет убедиться в том, что сценарий переименован успешно.