1 (изменено: YMP, 2015-02-27 16:32:47)

Тема: JScript: копирование файлов с заданными расширениями

Скрипт копирует из папки (а при желании и из всех её подпапок) файлы с указанными расширениями. Может копировать и все подряд. На новом месте воссоздаётся структура папок, в которых лежали файлы. Но может и не воссоздаваться. Смотрите настройки в начале скрипта.

from_folder="C:\\WSH";  // Откуда.
to_folder="D:\\Test";   // Куда. Если папка не существует, будет создана,
                        // и также все вышестоящие папки, если не существуют.
ext_list="txt,js,?";    // Список расширений. Если check_ext=0, игнорируется.
                        // Файлы без расширений обозначайте знаком вопроса.
check_ext=1;            // Учитывать расширения. 0 - нет, 1 - да.
subfolders=1;           // Копировать также из всех подпапок. 0 - нет, 1 - да.
all_together=0;         // Все файлы в одну папку (to_folder). 0 - нет, 1 - да.
overwrite=0;            // Перезапись файлов (совпадение имён). 0 - нет, 1 - да.
modify=0;               // Добавлять номер к имени файла (если запрещена
                        // перезапись и совпали имена). 0 - нет, 1 - да.

count=0;                // Счётчик скопированных файлов.
errors=0;               // Счётчик ошибок.
error_list="";          // Список неудач при копировании (не удалась
                        // перезапись, т.к. файл только для чтения).

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

if(!fso.FolderExists(from_folder)) {
  WScript.Echo("Не найдена папка-источник");
  WScript.Quit();
}
from_folder=fso.GetFolder(from_folder).Path; // На случай, если from_folder
                                             // была указана без соблюдения
                                             // регистра букв. В этом случае
                                             // метод replace не сработает.
copyFiles(from_folder);

if(errors) error_list="\n\nОшибок "+errors+":\n"+error_list;

WScript.Echo("Готово. Скопировано файлов: "+count+error_list);


//=================================================================

function copyFiles(sourcepath)
{
  var folder=fso.GetFolder(sourcepath);
  var files=new Enumerator(folder.Files);

  for(; !files.atEnd(); files.moveNext()) {
    var file=files.item();
    var oldpath=file.Path;
    var ext=fso.GetExtensionName(oldpath);
    if(!ext) ext = "\\?";
    var re = new RegExp("(?:^|,)" + ext + "(?:,|$)", "i");
    if(!check_ext || re.test(ext_list)) {
      var newpath=makeNewPath(oldpath, ext);
      checkParents(newpath);
      try {
        file.Copy(newpath, overwrite);
        ++count;
      }
      catch(e) {
        if(overwrite) {
          ++errors;
          error_list+=oldpath+" --> "+newpath+"\n";
        }
      }
    }
  }
  if(!subfolders) return;
  var folders=new Enumerator(folder.SubFolders);
  for(; !folders.atEnd(); folders.moveNext()) copyFiles(folders.item().Path);
}

function checkParents(path)
{
  var parentpath=fso.GetParentFolderName(path);
  if(!fso.FolderExists(parentpath)) {
    checkParents(parentpath);
    fso.CreateFolder(parentpath);
  }
}

function makeNewPath(path, ext)
{
  if(all_together)
    var newpath=to_folder+"\\"+fso.GetFileName(path);
  else
    var newpath=path.replace(from_folder, to_folder);
  if(!overwrite && modify) {
    var temppath=newpath.slice(0, -(ext.length+1))+"_", i=0;
    while(fso.FileExists(newpath)) newpath=temppath+(++i)+"."+ext;
  }
  return newpath;
}

2 (изменено: YMP, 2015-02-27 16:37:56)

Re: JScript: копирование файлов с заданными расширениями

Результат приспособления скрипта к задаче удаления файлов. С запросом у пользователя путей к папкам, из которых надо удалять. Для ввода путей использована функция VBScript InputBox, так что формат скрипта изменился - теперь код нужно сохранять с расширением .wsf .

<job>
<script language="VBScript">
  Function getFolderPath(Prompt, Default)
    getFolderPath=InputBox(Prompt, "Удаление файлов", Default)
  End Function
</script>

<script language="JScript">
  from_folder="C:\\test";   // Папка по умолчанию.
  ext_list="txt,js,?";      // Список расширений. Файлы без расширений
                            // обозначайте знаком вопроса.
  subfolders=0;             // Удалять также из всех подпапок. 0 - нет, 1 - да.
  force=0;                  // Удалять файлы только для чтения. 0 - нет, 1 - да.

  count=0;                  // Счётчик удалённых файлов.
  errors=0;                 // Счётчик ошибок.
  error_list="";            // Список неудач при удалении (не удалось
                            // удалить, т.к. файл только для чтения,
                            // или не найдена папка).

  inputhelp=getResource("help")+ext_list;      // Подсказка.
  paths=getFolderPath(inputhelp, from_folder); // Запрос путей у пользователя.
  if(!paths) WScript.Quit();                   // Если нажата "Отмена", выйти.

  paths=paths.split(";");   // Разбиваем введённую строку на массив путей.

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

  for(i=0; from_folder=paths[i]; ++i) {  // Выборка путей из массива.
    if(!fso.FolderExists(from_folder)) {
      ++errors;
      error_list+="Папка не найдена: "+from_folder+"\n";
      continue;
    }
    deleteFiles(from_folder);
  }

  if(errors) error_list="\n\nОшибок "+errors+":\n"+error_list;

  WScript.Echo("Готово. Удалено файлов: "+count+error_list);


//=================================================================

  function deleteFiles(sourcepath)
  {
    var folder=fso.GetFolder(sourcepath);
    var files=new Enumerator(folder.Files);

    for(; !files.atEnd(); files.moveNext()) {
      var file=files.item();
      var filepath=file.Path;
      var ext=fso.GetExtensionName(filepath);
      if(!ext) ext = "\\?";
      var re = new RegExp("(?:^|,)" + ext + "(?:,|$)", "i");
      if(re.test(ext_list)) {
        try {
          file.Delete(force);
          ++count;
        }
        catch(e) {
          ++errors;
          error_list+="Файл не удаляется: "+filepath+"\n";
        }
      }
    }
    if(!subfolders) return;
    var folders=new Enumerator(folder.SubFolders);
    for(; !folders.atEnd(); folders.moveNext())
      deleteFiles(folders.item().Path);
  }
</script>

<resource id="help">
Введите путь к папке. Если путей несколько,
разделяйте их точкой с запятой. Например:
C:\test;D:\temp;E:\documents

Будут удалены файлы с расширениями:
</resource>
</job>

3 (изменено: YMP, 2015-02-27 16:42:29)

Re: JScript: копирование файлов с заданными расширениями

Вариант удаляющего скрипта, выполненный в виде html-приложения. Код нужно сохранить с расширением .hta . Выводит окно, запрашивая у пользователя расширения, пути к папкам и прочие настройки.

<html>
<head>
<meta charset="windows-1251">
<title>Удаление файлов по расширениям</title>
<hta:application id="oHTA"
  applicationname="myApp"
  border="thin"
  borderstyle="normal"
  caption="yes"
  contextmenu="yes"
  icon="webpage.ico"
  innerborder="yes"
  maximizebutton="no"
  minimizebutton="yes"
  navigable="no"
  scroll="no"
  scrollflat="no"
  selection="no"
  showintaskbar="yes"
  singleinstance="yes"
  sysmenu="yes"
  version="1.0"
  windowstate="normal"
/>

<style type="text/css">
  body {background:#ddd}
  body * {font:8pt/10pt Verdana; color:#000}
  div.prompt {margin: 5 18}
  div.input {text-align:center}
  div.options {text-align:left; margin: 5 14}
</style>
</head>

<!-- ======================== Рисуем окно ======================== -->

<body onload="initWindow()">
  <div class="prompt">
    Задайте расширения файлов для удаления. Файлы без расширения обозначьте
    знаком вопроса. Пример: txt,js,vbs,?
  </div>
  <div class="input">
    <input id="extensions" type="text" size=70>
  </div>
  <div class="options">
    <input type="checkbox" id="readonly">
 Можно удалять файлы с атрибутом "только для чтения"
  </div><br>
  <div class="prompt">
    Введите путь к папке, в которой нужно удалить файлы.<br>
    Если папок несколько, разделяйте их пути точкой с запятой.<br>
    Пример: C:\Test;D:\Temp;E:\Documents
  </div>
  <div class="input">
    <input id="parents" type="text" size=70>
  </div>
  <div class="options">
    <input type="checkbox" id="recurse"> Удалять также файлы в подпапках
  </div><br>
  <div class="prompt">
    Введите пути к подпапкам, из которых файлы удалять нельзя.<br>
    Разделяйте пути точкой с запятой.
  </div>
  <div class="input">
    <input id="exceptions" type="text" size=70>
  </div><br><br>
  <div class="input">
    <input type="button" value="Удалить" onclick="startDel()"> &nbsp; &nbsp;
    <input type="button" value="Отмена" onclick="window.close()">
  </div>

<!-- ========================== Функции ========================== -->

  <script language="JScript">

    function initWindow()
    {
      var width=500, height=374;  // Ширина и высота окна.
      resizeTo(width, height);    // Задать размер.
      moveTo((screen.width-width)/2, (screen.height-height)/2); // Окно в центр.

      ext_list="txt,js,vbs";      // Расширения по умолчанию.
      extensions.value=ext_list;  // Вписываем их в поле.
    }

    function startDel()
    {
      if(ext_list=extensions.value)    // Смотрим, заданы ли расширения.
        ext_list.replace(/[ ]+/g, ""); // Убираем пробелы.
      else { alert("Не заданы расширения."); return } // Если нет, то выход.
                                                      
      subfolders=recurse.checked; // Смотрим флажок удаления подпапок.
      force=readonly.checked;     // То же для файлов "только для чтения".
      count=0;                    // Счётчик удалённых файлов.
      errors=0;                   // Счётчик ошибок.
      error_list="";              // Список неудач при удалении (не удалось
                                  // удалить, т.к. файл только для чтения,
                                  // или не найдена папка).

      if(paths=parents.value) {   // Смотрим, заданы ли папки.
          // Убираем лишние пробелы, если есть.
        paths=paths.replace(/^[ ]+|[ ]+$/g, "").replace(/[ ]*;[ ]*/g, ";");
        paths=paths.split(";");   // Разбиваем введённую строку на массив путей.
      }
      else { alert("Не заданы пути к папкам."); return }

      if(excepts=exceptions.value) {  // Если заданы подпапки-исключения.
        excepts=excepts.replace(/^[ ]+|[ ]+$/g, "").replace(/[ ]*;[ ]*/g, ";");
        excepts=excepts.split(";");
      }

      fso=new ActiveXObject("Scripting.FileSystemObject");

      for(i=0; from_folder=paths[i]; ++i) {  // Выборка путей из массива.
        if(!fso.FolderExists(from_folder)) { // Проверка пути.
          ++errors;
          error_list+="Папка не найдена: "+from_folder+"\n";
          continue;
        }
        deleteFiles(from_folder);
      } 

      if(errors) error_list="\n\nОшибок "+errors+":\n"+error_list;

      alert("Готово. Удалено файлов: "+count+error_list);
    }

    function deleteFiles(sourcepath)
    {
      for(var j=0; excepts && j<excepts.length; ++j)  // Проверка на исключение.
        if(excepts[j].toLowerCase()==sourcepath.toLowerCase()) return;

      var folder=fso.GetFolder(sourcepath);
      var files=new Enumerator(folder.Files);    // Коллекция файлов.

      for(; !files.atEnd(); files.moveNext()) {  // Перебор коллекции.
        var file=files.item();
        var filepath=file.Path;
        var ext=fso.GetExtensionName(filepath);
        if(!ext) ext = "\\?";
        var re = new RegExp("(?:^|,)" + ext + "(?:,|$)", "i");
        if(re.test(ext_list)) {      // Если расширение найдено в списке,
          try {                      // то пробуем удалить файл.
            file.Delete(force);
            ++count;
          }
          catch(e) {                 // Если не получилось.
            ++errors;
            error_list+="Файл не удаляется: "+filepath+"\n";
          }
        }
      }
      if(!subfolders) return; // Если удалять в подпапках не надо, выходим тут.
      var folders=new Enumerator(folder.SubFolders);
      for(; !folders.atEnd(); folders.moveNext())
        deleteFiles(folders.item().Path);
    }
  </script>
</body>
</html>

4

Re: JScript: копирование файлов с заданными расширениями

Во все три скрипта выше добавлена обработка файлов без расширений. Спасибо DD за сообщение об ошибке.