Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

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

 
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander printer-friendly view
View previous topic :: View next topic  
Author Message
keiran_green



Joined: 18 Nov 2011
Posts: 130
Location: Хабаровск

Post (Separately) Posted: Fri Dec 02, 2011 13:52    Post subject: Скрипт для очистки flash от: "все папки стали ярлыками". Reply with quote

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

Удаление файлов 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 файла включена


Last edited by keiran_green on Thu Dec 08, 2011 02:56; edited 5 times in total
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Fri Dec 02, 2011 14:32    Post subject: Reply with quote

keiran_green
Много воды в описаниях. 134 строки - не повод, чтобы выкладывать в MIME и повторять то, что написано в шапке скрипта. Советую посмотреть как тут шапки вообще оформляются. Вся остальная информация дана в памятке. Флаг проверки лучше реализовывать через параметр и цифры 0/1, например.
А при выделении папки не работает, потому что в 59 строке применяется метод GetFile. Надо бы
Code:
    script = fso.GetFile(WScript.Arguments.UnNamed.Item(0));
    f = fso.GetFolder(script.ParentFolder);
заменить на
Code:
    f = fso.GetFolder(fso.GetParentFolderName(WScript.Arguments(0));
Back to top
View user's profile Send private message
keiran_green



Joined: 18 Nov 2011
Posts: 130
Location: Хабаровск

Post (Separately) Posted: Fri Dec 02, 2011 14:33    Post subject: Reply with quote

Flasher
Спасибо, завтра исправлю.
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Fri Dec 02, 2011 14:39    Post subject: Reply with quote

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

P.S. CureIt! уже давно как триальный...
Back to top
View user's profile Send private message
keiran_green



Joined: 18 Nov 2011
Posts: 130
Location: Хабаровск

Post (Separately) Posted: Sat Dec 03, 2011 01:43    Post subject: Reply with quote

Обновил. скрипт.
Flasher
Если оставить только %P, тогда при запуске пишет "Разрешение отклонено"
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Sat Dec 03, 2011 11:22    Post subject: Reply with quote

keiran_green
Не вижу js-кода и убора воды (всё от кода до "Действие скрипта" можно выкинуть). Каждый раз вытаксивать из MIME и смотреть проблему желания нет.
Да, как вариант - в цикле массива fso.Drives перебрать if (fso.GetDrive(n).DriveType = 1) и работать со всеми доступными флешками.
Back to top
View user's profile Send private message
keiran_green



Joined: 18 Nov 2011
Posts: 130
Location: Хабаровск

Post (Separately) Posted: Sat Dec 03, 2011 14:27    Post subject: Reply with quote

Обновил скрипт.
Добавил параметр /autorun - для проверки авторана из тотала.
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Sat Dec 03, 2011 14:41    Post subject: Reply with quote

keiran_green wrote:
Добавил параметр ...
Тогда "PPS:..." из описания нужно убрать.
Вместо "WScript.Arguments.UnNamed.length != 0" проще "WScript.Arguments.Count > 0".
keiran_green wrote:
Если оставить только %P, тогда при запуске пишет "Разрешение отклонено"
Т.е. вместо "f = fso.GetFolder(fso.GetParentFolderName(WScript.Arguments(0)))" пишем "f = WScript.Arguments(0)" и ругается?
Back to top
View user's profile Send private message
Serge Yolkin



Joined: 25 Jul 2009
Posts: 664

Post (Separately) Posted: Sun Dec 04, 2011 00:06    Post subject: Reply with quote

keiran_green
Стесняюсь спросить: а почему переменная fso локальная, а остальные - глобальные?
Back to top
View user's profile Send private message
keiran_green



Joined: 18 Nov 2011
Posts: 130
Location: Хабаровск

Post (Separately) Posted: Sun Dec 04, 2011 12:19    Post subject: Reply with quote

Serge Yolkin wrote:
переменная fso локальная, а остальные - глобальные?

Потому что я не особо разбираюсь в WSH. На это как-то внимания не обращал. Smile
Ну чтож, значит будем читать теорию...
Back to top
View user's profile Send private message
Serge Yolkin



Joined: 25 Jul 2009
Posts: 664

Post (Separately) Posted: Sun Dec 04, 2011 13:08    Post subject: Reply with quote

keiran_green
Не навязываю свое вИдение, отформатил скрипт для собственного удобства (чтобы прочитать):
Code:
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 перечислить все переменные (с присвоением или без) через запятую, точка с запятой заканчивает перечисление.
Back to top
View user's profile Send private message
Flasher



Joined: 06 Nov 2009
Posts: 14229
Location: Москва

Post (Separately) Posted: Sun Dec 04, 2011 20:24    Post subject: Reply with quote

Не выдержал...
По-человечески (vbs):
Code:
'============================================================================
' 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
Back to top
View user's profile Send private message
Display posts from previous:   
Post new topic   Reply to topic    Total Commander Forum Index -> Автоматизация Total Commander All times are GMT + 4 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group