1

Тема: VBScript/JScript: Получить список файлов и их свойства

Добрый день.

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

  - обрабатывает каталог, указанный параметром на входе, получая иерархическую структуру входящих в него папок и файлов.
  - для файлов получает свойства (размер файла, полный путь, дата создания, дата последнего редактирования, расширение (тип), название, тема, автор, категория, ключевые слова, комментарии).
  - формирует txt или xml файл, который записывает по адресу, указанному во входящем параметре.

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

Частично похожие скрипты здесь попадались, но мои знания пока на уровне плинтуса....
Прошу помочь.

Цель затеи: инвентаризация существующих файлов и присвоение тегов для дальнейшего использования.

2

Re: VBScript/JScript: Получить список файлов и их свойства

Все очень просто... Именно по этой причине местные старожилы вряд ли будут вам внятно - 100 раз отвечено, и приведено в примерах.

Но не расстраивайтесь, вот вам кусочки из которых все это соберете.
1) обход дерева файлов/папок:

//Обход дерева папок с показом содержимого
var oFS = new ActiveXObject("Scripting.FileSystemObject");
var oFld = (oFS.GetFile(WScript.ScriptFullName)).ParentFolder.ParentFolder;
TreeDemo(oFld);

function TreeDemo(oFld)
{
  WScript.Echo(oFld.Path); //Показать путь
  var enFolders = new Enumerator(oFld.SubFolders);
  for ( ; !enFolders.atEnd(); enFolders.moveNext())
    WScript.Echo("  "+ enFolders.item().Name+ " (папка)"); //Показать папки
  enFolders = new Enumerator(oFld.Files); //Теперь это колл. файлов
  for ( ; !enFolders.atEnd(); enFolders.moveNext())
    WScript.Echo("  "+ enFolders.item().Name); //Показать файлы
  enFolders = new Enumerator(oFld.SubFolders); //Снова коллекция папок
  for ( ; !enFolders.atEnd(); enFolders.moveNext())
    arguments.callee(enFolders.item()); //Рекурсия в подпапку
}

2) Свойства получать через oFS.GetFile().Свойство (в примере выше использовалось одно из них - Name)
Ассортимент (для общего представления) следующий:

Свойства oFile (файла)
-------------------------
oFile {...} Object
Path "D:\00\Scripts\_debug-logs-files\file_props.js" String
Name "file_props.js" String
ShortPath "D:\00\Scripts\_DEBUG~1\FILE_P~1.JS" String
ShortName "FILE_P~1.JS" String
Drive {...} Object
ParentFolder {...} Object
Attributes 32 Object
DateCreated 10.05.2010 15:48:10 Date
DateLastModified 10.05.2010 15:54:02 Date
DateLastAccessed 10.05.2010 15:48:10 Date
Size 221 Variant
Type "JScript Script File" String

Свойства oFolder (папки)
---------------------------
- oFolder {...} Object
Path "D:\00\Scripts\_debug-logs-files" String
Name "_debug-logs-files" String
ShortPath "D:\00\Scripts\_DEBUG~1" String
ShortName "_DEBUG~1" String
- Drive {...} Object
  Path "D:" String
  DriveLetter "D" String
  ShareName "" String
  DriveType 2 Object
  + RootFolder {...} Object
  AvailableSpace 551718150144 Variant
  FreeSpace 551718150144 Variant
  TotalSize 1000203087872 Variant
  VolumeName "wdj" String
  FileSystem "NTFS" String
  SerialNumber 143236712 Number
  IsReady true Boolean
+ ParentFolder {...} Object
Attributes 16 Object
DateCreated 02.05.2010 18:37:11 Date
DateLastModified 10.05.2010 15:48:10 Date
DateLastAccessed 10.05.2010 15:48:10 Date
Type "Папка с файлами" String
IsRootFolder false Boolean
Size 16531 Variant
- SubFolders {...} Object
  Item Object
  _NewEnum {...} Object
  Count 0 Number
- Files {...} Object
  Item Object
  _NewEnum {...} Object
  Count 10 Number

3) Чтение/запись:
(к данному коду следует относиться критически - это демо с тучей ненужностей. Скорее не рабочий код, а рассуждения на тему "а что если...")

var sReadFileName = "4_read.txt";
var sWriteFileName = "4_write.txt";

var sReadFileFullName = sGetReadFileFullName(sReadFileName);
var sWriteFileFullName = sGetReadFileFullName(sWriteFileName);

var oReadFile, oWriteFile, oAppendFile;

var ForReading = 1, ForWriting = 2, ForAppending = 8; //Ручками прописываем режимы!
var oFS = new ActiveXObject("Scripting.FileSystemObject");

//Чтение файла
var sMsg = sReadFileFullName + " ";
sMsg += oFS.FileExists(sReadFileFullName) ? "есть!" : "нет";
WScript.Echo(sMsg);
if (oFS.FileExists(sReadFileFullName))
{
  try
  {
    /*Синтаксис object.OpenTextFile(filename[, iomode[, create[, format]]])
    iomode: ForReading = 1, ForWriting = 2, ForAppending = 8
    create: если запрошенный файл не существует   true создавать, false не создавать
    format:   -2  Opens the file using the system default
              -1  Opens the file as Unicode
               0  Opens the file as ASCII
    */
    oReadFile = oFS.OpenTextFile(sReadFileFullName, ForReading, false); //3-й параметр
    /*Возможные ошибки при OpenTextFile():
        * путь до файла не существует,
        * атрибут RO (hidden, system - не мешают),
        * недостаточные права доступа
        * недостаток места на диске (впрочем, это уже в процессе записи в файл)
    */
    WScript.Echo("Содержимое файла " + sReadFileName + ":\n" + oReadFile.ReadAll());
    WScript.Echo("---\nЧтение его же по строкам:");
    oReadFile.Close();
    oReadFile = oFS.OpenTextFile(sReadFileFullName, ForReading, false); //По достижении конца надо заново переоткрывать
    //while(!oReadFile.AtEndOfStream) //как вариант
    for ( var i = 1; !oReadFile.AtEndOfStream; i++)
    {
      var txt = ((i < 10) ? "0" : "") + i + " >" + oReadFile.ReadLine() + "<";
      WScript.Echo(txt);
    }
    //     oReadFile.WriteLine("xxx"); //Вызовет ошибку "Недопустимый режим файла"
    oReadFile.Close();
  } catch(e)
  {
    WScript.Echo("Ошибка при работе с файлом \"" + sReadFileName + "\": " + e.message);
    vardump(e);
  }
}

//Запись файла
oWriteFile = oFS.OpenTextFile(sWriteFileFullName, ForAppending, true); //Не проверяем, есть ли - все равно делаем
WScript.Echo("Открываем файл " + sReadFileName + " для записи");
var dt = new Date();
sMsg = "перезаписываемый файл\n" + dt.toLocaleString() + "\n";
sMsg += "случайное число " + Math.random().toFixed(5) + "\n"
WScript.Echo(sMsg);
oWriteFile.WriteLine(sMsg);
oWriteFile.Close();
WScript.Echo("Записали, закрыли.");

4) Самое главное. Коллекция ссылок на документацию
Если с английским более менее, рекомендую chm из 3 поста.

(Это были примеры на JScript)

3

Re: VBScript/JScript: Получить список файлов и их свойства

Спасибо за код и за ссылки.
Для начала подойдет, буду экспериментировать.

По факту экспериментов отпишусь.