Скрипт для очистки flash от: "все папки стали ярлыками".

Обсуждение вопросов автоматизации Total Commander с помощью сторонних программ и скриптовых технологий.

Модераторы: d-view, Моторокер, Avada, CaptainFlint, Nik

Ответить
Аватара пользователя
keiran_green
Сообщения: 130
Зарегистрирован: Пт ноя 18, 2011 03:20
Откуда: Хабаровск

Скрипт для очистки flash от: "все папки стали ярлыками".

Сообщение keiran_green »

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

Код: Выделить всё

/*
################################################################################

Удаление файлов lnk и восстановление скрытых папок.

последнее изменение 08.12.2011

отображает скрытые папки и перемещает файлы *.lnk в отдельную папку
Использование: скопировать файл в папку или в корень флешки и запустить
PS: проверяет только текущую папку
PPS: для проверки и пермешения файла autorun.inf
     в строке
       autorun_check = 0;
     заменить на
       autorun_check = 1;

################################################################################

Для создания кнопки в Total Commander перетащить файл скрипта на панель TC,
в свойствах появившейся кнопки, в поле "параметры" указать '%P%N' (без кавычек)
Использование в ТС: выбрать любой файл/папку в панели и нажать на кнопку.

Для проверки autorun'a дописать в конец строки параметров '/autorun'  т.е.
получиться должно так:
  '%P%N /autorun'
################################################################################
*/

var
fso = new ActiveXObject("Scripting.FileSystemObject"),
WshShell = WScript.CreateObject("WScript.Shell"),
attr = new Array (17,18,19,20,21,22,23,24,25,26,48,49,50,51,55,56,57,58,null),

autorun_check = 0, //1 - будет проверять наличие файл autorun.inf

s = "",

FldrCnt = 0,
LnkCount = 0,
intButton = -1,
d = new Date(),
DateTime = d.getDay() +"."+ d.getMonth()+"."+d.getYear()
              +"#"+d.getHours()+"."+d.getMinutes()+"."+d.getSeconds();

//если был передан аргумент проверки autorun...
if (WScript.Arguments.Named.exists("autorun"))
{
autorun_check = 1;
}

if (autorun_check == 1)
{
autorun_exist = false;
AutorunName = "\autorun_" + DateTime +".inf";
}

if (WScript.Arguments.UnNamed.length == 0)
  {
  script = fso.GetFile(WScript.ScriptFullName);
  f = fso.GetFolder(script.ParentFolder);
  fFldrLnk = script.ParentFolder + "\\!ярлыки\\";

  text = "Данный скрипт отображает скрытые папки + перемещает\nвсе найденные ярлыки в " +
  "папку \"" +fFldrLnk+DateTime+"\\\"\n\nИспользование:\nскопировать скрипт в корень флешки, запустить\nи согласиться на " +
  "лечение.\n\nЗапустить лечение в папке \"" + script.ParentFolder + "\" ?"

  intButton = WshShell.Popup (text, -1, "Устранение последствий вирусов", 4)
  }

if ((WScript.Arguments.UnNamed.length != 0) && (intButton != 6))
  {
    f = fso.GetFolder(fso.GetParentFolderName(WScript.Arguments(0)));
    fFldrLnk = f + "\\!ярлыки\\";
  }

if ((intButton == 6) || (WScript.Arguments.UnNamed.length != 0))
{
  sFiles = new Enumerator(f.Files )
  for (; !sFiles.atEnd(); sFiles.moveNext())
    {
    ext = fso.GetExtensionName(sFiles.item().Name);
      if ((ext == "lnk") ||(ext == "LNK")
        ||(ext == "Lnk") ||(ext == "LNk")
        ||(ext == "LNK") ||(ext == "lNK")
        ||(ext == "lnK") ||(ext == "LnK")
        ||(ext == "lNk"))
      {

      if (fso.FolderExists(fFldrLnk) == false)
        {
          fso.CreateFolder(fFldrLnk)
        }

      if (fso.FolderExists(fFldrLnk +DateTime+"\\") == false)
        {
          fso.CreateFolder(fFldrLnk +DateTime+"\\")
        }

        s = sFiles.item().Name
        fso.MoveFile(sFiles.item().Name , fFldrLnk + DateTime+"\\")
        LnkCount++;
        sFiles = new Enumerator(f.Files);
      }
      if (autorun_check == 1)
      {
        if (sFiles.item().Name == "autorun.inf")
          {

            if (fso.FolderExists(fFldrLnk) == false)
              {
               fso.CreateFolder(fFldrLnk)
              }

            sFiles.item().Attributes = 0;
            fso.MoveFile(sFiles.item().Name , fFldrLnk + AutorunName )
            autorun_exist = true;
            sFiles = new Enumerator(f.Files);
          }
      }
    }

fFldr = new Enumerator(f.SubFolders);
  for (; !fFldr.atEnd(); fFldr.moveNext())
    {
     for (i = 0; attr[i] != null; i++)
      {
        if (fFldr.item().Attributes == attr[i])
          {
            fFldr.item().Attributes = 0;
            FldrCnt++;
            break;
          }
      }
    }
  s = "Oбработано:\n" +
    "   скрытых папок: " + FldrCnt +"\n"+
    "   ярлыков: "  + LnkCount ;

  if ((autorun_check == 1) && (autorun_exist))
  {
    s = s + "\n\nОбнаружен и перемещен autorun.inf файл.";
  }
  WshShell.Popup(s, -1, "Готово", 64)
}
  • Действие скрипта:
  • Скрипт проверяет текущую папку на наличие скрытых папок и ярлыков;
  • Атрибут "скрытый" у папок убирается;
  • Все найденные ярлыки перемещаются в папку "!ярлыки";
  • Файл "autorun.inf" переименовывается* (добавляется дата в имя файла) и тоже перемещается в папку "!ярлыки";
    * - если проверка autorun файла включена
Последний раз редактировалось keiran_green Чт дек 08, 2011 02:56, всего редактировалось 5 раз.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

keiran_green
Много воды в описаниях. 134 строки - не повод, чтобы выкладывать в MIME и повторять то, что написано в шапке скрипта. Советую посмотреть как тут шапки вообще оформляются. Вся остальная информация дана в памятке. Флаг проверки лучше реализовывать через параметр и цифры 0/1, например.
А при выделении папки не работает, потому что в 59 строке применяется метод GetFile. Надо бы

Код: Выделить всё

    script = fso.GetFile(WScript.Arguments.UnNamed.Item(0));
    f = fso.GetFolder(script.ParentFolder);
заменить на

Код: Выделить всё

    f = fso.GetFolder(fso.GetParentFolderName(WScript.Arguments(0));
Аватара пользователя
keiran_green
Сообщения: 130
Зарегистрирован: Пт ноя 18, 2011 03:20
Откуда: Хабаровск

Сообщение keiran_green »

Flasher
Спасибо, завтра исправлю.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

keiran_green
Ок. Хотя я так вообще и не понял, зачем тут %P%N, если достаточно %P или WSH.CurrentDirectory (с пустым путём запуска).

P.S. CureIt! уже давно как триальный...
Аватара пользователя
keiran_green
Сообщения: 130
Зарегистрирован: Пт ноя 18, 2011 03:20
Откуда: Хабаровск

Сообщение keiran_green »

Обновил. скрипт.
Flasher
Если оставить только %P, тогда при запуске пишет "Разрешение отклонено"
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

keiran_green
Не вижу js-кода и убора воды (всё от кода до "Действие скрипта" можно выкинуть). Каждый раз вытаксивать из MIME и смотреть проблему желания нет.
Да, как вариант - в цикле массива fso.Drives перебрать if (fso.GetDrive(n).DriveType = 1) и работать со всеми доступными флешками.
Аватара пользователя
keiran_green
Сообщения: 130
Зарегистрирован: Пт ноя 18, 2011 03:20
Откуда: Хабаровск

Сообщение keiran_green »

Обновил скрипт.
Добавил параметр /autorun - для проверки авторана из тотала.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

keiran_green писал(а):Добавил параметр ...
Тогда "PPS:..." из описания нужно убрать.
Вместо "WScript.Arguments.UnNamed.length != 0" проще "WScript.Arguments.Count > 0".
keiran_green писал(а):Если оставить только %P, тогда при запуске пишет "Разрешение отклонено"
Т.е. вместо "f = fso.GetFolder(fso.GetParentFolderName(WScript.Arguments(0)))" пишем "f = WScript.Arguments(0)" и ругается?
Serge Yolkin
Сообщения: 664
Зарегистрирован: Сб июл 25, 2009 11:12

Сообщение Serge Yolkin »

keiran_green
Стесняюсь спросить: а почему переменная fso локальная, а остальные - глобальные?
Аватара пользователя
keiran_green
Сообщения: 130
Зарегистрирован: Пт ноя 18, 2011 03:20
Откуда: Хабаровск

Сообщение keiran_green »

Serge Yolkin писал(а):переменная fso локальная, а остальные - глобальные?
Потому что я не особо разбираюсь в WSH. На это как-то внимания не обращал. :)
Ну чтож, значит будем читать теорию...
Serge Yolkin
Сообщения: 664
Зарегистрирован: Сб июл 25, 2009 11:12

Сообщение Serge Yolkin »

keiran_green
Не навязываю свое вИдение, отформатил скрипт для собственного удобства (чтобы прочитать):

Код: Выделить всё

var
 attr=new Array(17,18,19,20,21,22,23,24,25,26,48,49,50,51,55,56,57,58,null),
 autorun_check=0, //1 - будет проверять наличие файл autorun.inf
 autorun_exist,
 AutorunName,
 d,
 f,
 fFldr,
 fFldrLnk,
 FldrCnt=0,
 fso=new ActiveXObject('Scripting.FileSystemObject'),
 intButton=-1,
 LnkCount=0,
 s='',
 script,
 sFiles,
 text,
 WshShell=WScript.CreateObject('WScript.Shell');
//если был передан аргумент проверки autorun...
if(WScript.Arguments.Named.exists('autorun'))autorun_check=1;
if(autorun_check==1){
  d=new Date();
  autorun_exist=false;
  AutorunName='\autorun_'+d.getDay()+'.'+d.getMonth()+'.'+d.getYear()+
   '#'+d.getHours()+'.'+d.getMinutes()+'.'+d.getSeconds()+'.inf';
}
if(WScript.Arguments.UnNamed.length==0){
  script=fso.GetFile(WScript.ScriptFullName);
  f=fso.GetFolder(script.ParentFolder);
  fFldrLnk=script.ParentFolder+'\\!ярлыки\\';
  text='Данный скрипт отображает скрытые папки+перемещает\nвсе найденные ярлыки в папку «'+
   fFldrLnk+'»\nИспользование:\n\tскопировать скрипт в корень флешки, запустить\nи согласиться на '+
   'лечение.\nЗапустить лечение в папке «'+script.ParentFolder+'» ?';
  intButton=WshShell.Popup(text,-1,'Устранение последствий вирусов',4);
}
if((WScript.Arguments.UnNamed.length!=0)&&(intButton!=6)){
  f=fso.GetFolder(fso.GetParentFolderName(WScript.Arguments(0)));
  fFldrLnk=f+'\\!ярлыки\\';
}
if((intButton==6)||(WScript.Arguments.UnNamed.length!=0)){
  sFiles=new Enumerator(f.Files);
  for(;!sFiles.atEnd();sFiles.moveNext()){
    var ext=fso.GetExtensionName(sFiles.item().Name);
    if(ext.toLowerCase()=='lnk'){
      if(fso.FolderExists(fFldrLnk)==false)fso.CreateFolder(fFldrLnk)
      fso.MoveFile(sFiles.item().Name,fFldrLnk);
      LnkCount++;
      sFiles=new Enumerator(f.Files);
    }
    if(autorun_check==1){
      if(sFiles.item().Name=='autorun.inf'){
        if(fso.FolderExists(fFldrLnk)==false)fso.CreateFolder(fFldrLnk);
        sFiles.item().Attributes=0;
        fso.MoveFile(sFiles.item().Name,fFldrLnk+AutorunName);
        autorun_exist=true;
        sFiles=new Enumerator(f.Files);
      }
    }
  }
  fFldr=new Enumerator(f.SubFolders);
  for(;!fFldr.atEnd();fFldr.moveNext()){
    for(i=0;attr[i]!=null;i++){
      if(fFldr.item().Attributes==attr[i]){
        fFldr.item().Attributes=0;
        FldrCnt++;
        break;
      }
    }
  }
  s='Oбработано:\n'+
   '\tскрытых папок: '+FldrCnt+'\n'+
   '\tярлыков: '+LnkCount;
  if((autorun_check==1)&&(autorun_exist)){
    s=s+'\n\nОбнаружен и перемещен autorun.inf файл.';
  }
  WshShell.Popup(s, -1, 'Готово', 64);
}
Из теории: чтобы объявить локальную переменную, используется var, иначе переменная глобальная. Чтобы не писать это "var" перед каждой строчкой присвоения, можно после одного var перечислить все переменные (с присвоением или без) через запятую, точка с запятой заканчивает перечисление.
Аватара пользователя
Flasher
Сообщения: 14229
Зарегистрирован: Пт ноя 06, 2009 00:33
Откуда: Москва

Сообщение Flasher »

Не выдержал...
По-человечески (vbs):

Код: Выделить всё

'============================================================================
' 1. Снять у папок в корнях флешек атрибуты "скрытый" и "системный"
' 2. Переместить ярлыки, имеющие данные атрибуты, в папку "Скрытые ярлыки"
' 3. Добавить к имени autorun.inf дату и переместить в папку "Скрытые ярлыки"
' Параметр по желанию (флаг на обработку autorun.inf): <любой символ>
'============================================================================
With CreateObject("Scripting.FileSystemObject")
  For Each D in .Drives
    If .GetDrive(D).DriveType = 1 Then
      HLinks = D & "\Скрытые ярлыки\"
      Set Fd = CreateObject("Shell.Application").NameSpace(D & "\")
      For Each F in .GetFolder(D).SubFolders
        Attr = Fd.GetDetailsOf(Fd.ParseName(F.Name), 6)
        A = .GetFolder(F).Attributes
        H = InStr(Attr, "H") : S = InStr(Attr, "S")
        If H Then A = A - 2 : If S Then A = A - 4
        If H Or S Then .GetFolder(F).Attributes = A
      Next
      For Each F in .GetFolder(D).Files
        Set PN = Fd.ParseName(F.Name)
        Attr = Fd.GetDetailsOf(PN, 6)
        If PN.IsLink And (InStr(Attr, "H") Or InStr(Attr, "S")) Then
          If Not .FolderExists(HLinks) Then .CreateFolder(HLinks)
          F.Move HLinks
        End If
        If WScript.Arguments.Count Then
          If F.Name = "autorun.inf" Then _
          F.Move HLinks & "autorun_" & Replace(Replace(Now, "/", "."), ":", "-") & ".inf"
        End If
      Next
    End If
  Next
End With
CreateObject("WScript.Shell").Popup "Исполнено!", 1.4, "Результат", 64
WScript.Quit
Ответить