Отчет об использовании дискового пространства

Отчет об использовании дискового пространства

Напишем сценарий DrivesReport.js, который будет создавать таблицу использования дискового пространства для дисков всех типов (съемных, жестких и сетевых), имеющихся на компьютере, в следующем формате:

Диск: буква_диска  Метка тома: метка  Общий объем, Mb: n1  Используется, Mb: n2  Свободно, Mb: n3 

Для этого в сценарии вывод информации производится в текстовый файл rep.txt (переменная RepFile), который затем открывается с помощью Блокнота (рис. 5.8):

//Создаем объект WshShell

WshShell=WScript.CreateObject("WScript.Shell");

//Запускаем Блокнот (notepad.exe) и открываем в нем файл rep.txt

WshShell.Run("notepad.exe rep.txt"); 

Данные об одном диске формируются в функции WriteDriveInfo(drive), где в качестве параметра drive подставляется объект Drive для нужного диска. Соответствующие объекты Drive для всех дисков, имеющихся в системе, создаются в функции LoopDrives():

// Функция для перебора в цикле всех устройств (дисков)

function LoopDrives() {

 var Drives;

 //Создаем коллекцию дисков

 Drives = new Enumerator( FSO.Drives );

 //Цикл по всем дискам

 for(; !Drives.atEnd(); Drives.moveNext()) WriteDriveInfo(Drives.item());

}

Рис. 5.8. Сформированный отчет об использовании дискового пространства

В функции WriteDriveInfo(drive) сначала проверяется готовность устройства drive — если свойство IsReady объекта Drive равно true, то для этого устройства определяются общий объем (свойство TotalSize), объем свободного пространства (свойство FreeSpace), буква диска (свойство DriveLetter) и метка тома (свойство FreeSpace):

//Вычисляем общий объем диска в мегабайтах

Total = Math.round(drive.TotalSize/1048576);

//Вычисляем объем свободного пространства в мегабайтах

Free = Math.round(drive.FreeSpace/1048576);

//Вычисляем объем использованного пространства в мегабайтах

Used = Total - Free;

//Определяем букву диска

DriveLetter=drive.DriveLetter+":";

//Определяем метку тома

VolumeName=drive.VolumeName;

Строки с полученными значениями затем приводятся к нужному виду с помощью вспомогательных функций LFillStr (выравнивание строки влево), FillStr (выравнивание строки по центру) и записываются в выходной файл RepFile:

RepFile.WriteLine("+---------------------------------------------------+");

//Записываем информацию о букве диска

s="|"+FillStr(51,"Диск "+DriveLetter)+"|";

RepFile.WriteLine(s);

RepFile.WriteLine("+---------------------------------------------------+");

//Записываем информацию о метке тома

s="|"+LFillStr(25,"Метка тома: "+VolumeName)+"|";

//Записываем информацию об общем объеме диска

s+=LFillStr(25,"Общий объем, Mb: "+Total)+"|";

RepFile.WriteLine(s);

RepFile.WriteLine("+---------------------------------------------------+");

//Записываем информацию об использованном пространстве

s="|"+LFillStr(25,"Используется, Mb: "+Used.toString())+"|";

//Записываем информацию о свободном пространстве

s+=LFillStr(25,"Свободно, Mb: "+Free.toString())+"|";

RepFile.WriteLine(s);

RepFile.WriteLine("+---------------------------------------------------+");

Если же устройство drive не готово (свойство IsReady равно false), то с помощью свойства DriveType проверяется, не является ли ли диск сетевым (в этом случае DriveType=3), после чего в файл выводится соответствующее сообщение:

if (drive.DriveType == 3) { //Проверяем, является ли диск сетевым

 //Записываем информацию о букве диска

 RepFile.WriteLine( "Диск " + drive.DriveLetter + " является сетевым" );

 //Записываем пустые строки

 RepFile.WriteLine();

 RepFile.WriteLine();

} else {

 //Устройство не готово

 RepFile.WriteLine( "Устройство " + drive.DriveLetter + ": не готово" );

 //Записываем пустые строки

 RepFile.WriteLine();

 RepFile.WriteLine();

}

Полный текст сценария DrivesReport.js приведен в листинге 5.16.

Листинг 5.16. Отчет об использовании дискового пространства для всех устройств на компьютере

/*******************************************************************/

/* Имя: DrivesReport.js                                            */

/* Язык: JScript                                                   */

/* Описание: Формирование отчета об использовании дискового        */

/*           пространства для всех устройств на компьютере         */

/*******************************************************************/

//Объявляем переменные

var FSO, RepFile, MDate,WshShell, ForWriting = 2;

// Функция для перебора в цикле всех устройств (дисков)

function LoopDrives() {

 var Drives;

 //Создаем коллекцию дисков

 Drives = new Enumerator( FSO.Drives );

 //Цикл по всем дискам

 for(; !Drives.atEnd(); Drives.moveNext()) WriteDriveInfo(Drives.item());

}

// Функция для вывода информации об одном устройстве (диске)

function WriteDriveInfo(drive) {

 var s,Total,Free,Used,DriveLetter,VolumeName;

 if (drive.IsReady) { //Проверяем готовность устройства

  //Вычисляем общий объем диска в мегабайтах

  Total = Math.round(drive.TotalSize/1048576);

  //Вычисляем объем свободного пространства в мегабайтах

  Free = Math.round(drive.FreeSpace/1048576);

  //Вычисляем объем использованного пространства в мегабайтах

  Used = Total - Free;

  //Определяем букву диска

  DriveLetter=drive.DriveLetter+":";

  //Определяем метку тома

  VolumeName=drive.VolumeName;

  RepFile.WriteLine("+---------------------------------------------------+");

  //Записываем информацию о букве диска

  s="|"+FillStr(51,"Диск "+DriveLetter)+"|";

  RepFile.WriteLine(s);

  RepFile.WriteLine("+---------------------------------------------------+");

  //Записываем информацию о метке тома

  s="|"+LFillStr(25,"Метка тома: "+VolumeName)+"|";

  //Записываем информацию об общем объеме диска

  s+=LFillStr(25,"Общий объем, Mb: "+Total)+"|";

  RepFile.WriteLine(s);

  RepFile.WriteLine("+---------------------------------------------------+");

  //Записываем информацию об использованном пространстве

  s="|"+LFillStr(25,"Используется, Mb: "+Used.toString())+"|";

  //Записываем информацию о свободном пространстве

  s+=LFillStr(25,"Свободно, Mb: "+Free.toString())+"|";

  RepFile.WriteLine(s);

  RepFile.WriteLine("+---------------------------------------------------+");

  //Записываем пустые строки

  RepFile.WriteLine();

  RepFile.WriteLine();

 } else if (drive.DriveType == 3) { //Проверяем, является ли диск сетевым

  //Записываем информацию о букве диска

  RepFile.WriteLine( "Диск " + drive.DriveLetter + " является сетевым" );

  //Записываем пустые строки

  RepFile.WriteLine();

  RepFile.WriteLine();

 } else {

  //Устройство не готово

  RepFile.WriteLine( "Устройство " + drive.DriveLetter + ": не готово" );

  //Записываем пустые строки

  RepFile.WriteLine();

  RepFile.WriteLine();

 }

}

/*******************  Начало  **********************************/

//Создаем объект FileSystemObject

FSO = WScript.CreateObject("Scripting.FileSystemObject");

//Открываем файл rep.txt

RepFile = FSO.OpenTextFile("rep.txt", ForWriting, true);

//Определяем текущую дату и время

MDate = new Date();

//Записываем дату и время в отчет

RepFile.WriteLine("Дата отчета: " + MDate);

RepFile.WriteLine();

//Вызываем функцию LoopDrives

LoopDrives();

//Закрываем файл rep.txt

RepFile.Close();

//Создаем объект WshShell

WshShell=WScript.CreateObject("WScript.Shell");

//Запускаем Блокнот (notepad.exe) и открываем в нем файл rep.txt

WshShell.Run("notepad.exe rep.txt");

/*************  Конец *********************************************/

// Вспомогательные функции 

//Выравнивание строки s вправо в поле длиной l символов

function RFillStr(l,s) { 

 var ss,i,ll;

 ll=l-s.length;

 if (s.length>=l) {

  return(s);

 } else {

  ss=s;

  for (i=1;i<=ll;i++) {

   ss=" "+ss;

  }

  return(ss);

 }

}

//Выравнивание строки s влево в поле длиной l символов

function LFillStr(l,s) {

 var ss,i,ll;

 ll=l-s.length;

 if (s.length>=l) {

  return(s);

 } else {

  ss=s;

  for (i=1;i<=ll;i++) {

   ss=ss+" ";

  }

  return(ss);

 }

}

//Выравнивание строки s по центру в поле длиной l символов

function FillStr(l,s) {

 var ss,i,ll,s1,l2;

 ll=l-s.length;

 if (s.length>=l) {

  return(s);

 } else {

  ss=s;

  l2=Math.round((l-s.length)/2);

  ss=LFillStr(s.length+l2,s);

  ss=RFillStr(l,ss);

  return(ss);

 }

}