Author Topic: Вывод списка подкаталогов в файл  (Read 3756 times)

0 Members and 3 Guests are viewing this topic.

intro

  • Зашел в гости
  • *
  • Posts: 16
    • View Profile
Всем доброго времени суток!
Вопрос собственно в названии темы. Столкнулся с такой проблемой, а опыта и знаний не хватает. Нужно вывести в файл имена всех подкаталогов из определенной папки. Команда GETDIRLIST находит папки только на первом уровне. А мне нужен полный список всех вложенных папок, на всю глубину, с путями. Долго бился с циклами и условиями, пока совсем не запутался.  :-[
Я только начал осваивать Clickermann. Всякие мелочи уже могу делать сам, но со сложными алгоритмами пока не дружу. Уверен, что для знатоков такой скрипт строк в 10 написать не проблема, а я всю голову сломал. Если кто поможет решить задачку, буду очень благодарен.
Заранее спасибо.

intro

  • Зашел в гости
  • *
  • Posts: 16
    • View Profile
Re: Вывод списка подкаталогов в файл
« Reply #1 on: May 17, 2020, 07:01:14 PM »
Пока ждал помощи здесь, разместил вопрос ешё на паре форумов. Нашелся один умелец. За готовый скрипт он запросил 500 рублей. Говорит, что "алгоритм сложный для понимания и вообще, такое мало кто сможет зделать" и что "это еще не дорого". А сам он якобы уложится в 10 строк кода, включая сортировку и HALT. Верится с трудом. Наверно ищет дурака, чтобы кинуть на бабки. В общем - тут тишина, а там просят денег. ;D
Или на самом деле всё так сложно и дорого? Мне первому чтоли взбрело в голову просканировать вложенные папки? ;D

ya12

  • Активный участник
  • ***
  • Posts: 165
    • View Profile
Re: Вывод списка подкаталогов в файл
« Reply #2 on: May 17, 2020, 10:23:37 PM »
Раньше никому не требовалось. Как сделать чисто на кликермане не знаю.
Вот эта команда в .bat файле выводит содержимое подкаталогов в файл a.txt
dir /a:d /s >> a.txt
« Last Edit: May 17, 2020, 10:27:56 PM by ya12 »

intro

  • Зашел в гости
  • *
  • Posts: 16
    • View Profile
Re: Вывод списка подкаталогов в файл
« Reply #3 on: May 18, 2020, 09:46:39 AM »
Вот эта команда в .bat файле выводит содержимое подкаталогов в файл a.txt
dir /a:d /s >> a.txt

Спасибо, :) как вариант тоже пригодится.

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Вывод списка подкаталогов в файл
« Reply #4 on: May 18, 2020, 10:32:39 AM »
Code: (clickermann) [Select]
EXECUTE("cmd.exe", "/C chcp 1251>nul && dir /ad /s /b /on >file.txt")кодировка файла cp866


Если нужно читать файл кликером можно сделать кодировку 1251
Code: (clickermann) [Select]
TFWRITE("cmd.bat", "chcp 1251>nul")
TFWRITE("cmd.bat", "dir /ad /s /b /on >dir.txt")
TFWRITE("cmd.bat", "chcp 1251>nul")
TFWRITE("cmd.bat", "dir /ad /s /b /on >dir.txt")
TFWRITE("cmd.bat", "del /F /S cmd.bat")
EXECUTE("cmd.bat", "/U")

WAITMS(300)
FOR($i=1, $i < TFCOUNT("dir.txt")+1)
   $addr = TFREAD("dir.txt", $i)
   LOGWRITE($addr)
   WAITMS(20)
END_CYC
Именно так, 2 раза. Не знаю в чём прикол, но на моей системе при одном повторении кодировка не переключается.
« Last Edit: May 18, 2020, 11:09:03 AM by Vint »


4.У.В.@.К

  • Активный участник
  • ***
  • Posts: 117
    • View Profile
Re: Вывод списка подкаталогов в файл
« Reply #5 on: May 18, 2020, 10:59:04 AM »
...
Нашелся один умелец. За готовый скрипт он запросил 500 рублей. Говорит, что "алгоритм сложный для понимания и вообще, такое мало кто сможет зделать"
...

С каких это пор стал сложным для понимания "тупой" перебор ячеек массива в цикле? ;D Там же нет ничего больше в этом скрипте. Даже условий никаких нет. Все хоть раз такое уже делали. Другое дело, что не всем оно надо, это правда.
Мне вот надо, для раскидывания по папкам сайта файла index.html. Это древняя рекомендация по устранению уязвимости сайтов, для запрета доступа к каталогам. И делал я скрипт для этого. Привожу его просто как пример. Скрипт для Clickermann v4.14, но GETDIRLIST доступен уже в v4.13. Делал для себя, без оптимизаций - работает и ладно. Если из моего скрипта выкинуть всё лишнее, то как раз и останется десяток строк.
Если пример не поможет, могу допилить под данную задачу. Только позже, сейчас нет времени.

Code: (clickermann) [Select]
#name "index.html"

LOGCLEAR

$root = "C:\Сайт" // без закрывающего слэша

$copying = RADIOBOX("Выберете пункт", "Проверить", "Копировать") // копирование: запрешено - 1, разрешено - 2

$file = "index.html"

//-------------------------------

$exceptions = "Версии:Резерв:Новая папка" // Исключения

STRSEPARATE($exceptions, ":", $exceptlist)

//-------------------------------

TFCLEAR("Замены.txt", 0)

$path = STRCONCAT($root, "*")

ARRPUSH($dirs, $root) // включая корневую директорию

//LOGWRITE ($path)

//-------------------------------

SUB(Исключения)
   UNDEFINE($contains)
   FOR($i = 0, $i < ARRSIZE($exceptlist))
      IF(STRPOS($path, $exceptlist[$i]) != 0)
         INC($contains)
         $i = ARRSIZE($exceptlist)
      END_IF
   END_CYC
   IF($contains = 0)
      ARRPUSH($dirs, $path)
   END_IF
END_SUB

//-------------------------------

FOR($n = 0, $n < ARRSIZE($dirs))
   
   $path = STRCONCAT($dirs[$n], "\*")
   
   //   LOGWRITE ($path) // весь список в лог
   
   GETDIRLIST($tmp, $path)
   
   WHILE(ARRSIZE($tmp))
      $dir = ARRPOP($tmp)
      $path = STRCONCAT($dirs[$n], "\", $dir)
      Исключения() // фильтр исключений
      //      ARRPUSH($dirs, $path)
   END_CYC
   
END_CYC

//TFWRITEARR("out.txt", $dirs) // весь список директорий в файл

//-------------------------------

WHILE(ARRSIZE($dirs))
   
   $dir = ARRPOP($dirs)
   $path = STRCONCAT($dir, "\", $file)
   
   //   LOGWRITE ($path)
   
   //-------------------------------
   
   IF(FEXISTS($path))
      //      FDELETE($path)
   ELSE
     
      INC($copy)
     
      TFWRITE(STRCONCAT("Замены - ", $_date_str, " ", $_time_h, "-", $_time_m, "-", $_time_s, ".log"), $path)
     
      IF($copying = 2)
         FCOPY($file, $path)
      END_IF
     
   END_IF
   
END_CYC

LOGWRITE ("Скопировано файлов - ", $copy)

HALT

4.У.В.@.К

  • Активный участник
  • ***
  • Posts: 117
    • View Profile
Re: Вывод списка подкаталогов в файл
« Reply #6 on: May 18, 2020, 05:10:12 PM »
Вот тебе и 10 строк. По другому вроде и не напишешь.
И всего то - за 490 ₽ (ПандеМайская скидка - 10 ₽). ;D

Для Clickermann v4.13
Code: (clickermann) [Select]
ARRPUSH($dirs, "C:\Program Files")
FOR($a = 0, $a < ARRSIZE($dirs))
   GETDIRLIST($tmp, STRCONCAT($dirs[$a], "\*"))
   FOR($b = 0, $b < ARRSIZE($tmp))
      ARRPUSH($dirs, STRCONCAT($dirs[$a], "\", $tmp[$b]))
   END_CYC
END_CYC
ARRSORT($dirs)
TFWRITEARR("dirs.txt", $dirs)
HALT

intro

  • Зашел в гости
  • *
  • Posts: 16
    • View Profile
Re: Вывод списка подкаталогов в файл
« Reply #7 on: May 19, 2020, 10:55:30 AM »
Огромное спасибо всем за помощь и исчерпывающие ответы. Хорошая получилась тема.
Все варианты отлично работают и будут полезны не только мне, но и другим новичкам.
Спасибо! :)

4.У.В.@.К

  • Активный участник
  • ***
  • Posts: 117
    • View Profile
Re: Вывод списка подкаталогов в файл
« Reply #8 on: May 19, 2020, 05:58:01 PM »
Огромное спасибо всем за помощь и исчерпывающие ответы. Хорошая получилась тема.
Все варианты отлично работают и будут полезны не только мне, но и другим новичкам.
Спасибо! :)

Да незачто. Обращайся. :D

Axelenz

  • Освоившийся
  • **
  • Posts: 31
  • Парсинг сайтов, наполнение интернет-магазинов
    • View Profile
Re: Вывод списка подкаталогов в файл
« Reply #9 on: May 30, 2020, 01:29:16 PM »
Code: (clickermann) [Select]
//Подпрограмма вставить данные из буфера в PS (нажать/отпустить правую клавишу мышки)
SUB(down_up)
   POSTMESSAGE(WNDFIND("Windows PowerShell"), 0x0204, 0, 0)
   WAITMS(100)
   POSTMESSAGE(WNDFIND("Windows PowerShell"), 0x0205, 0, 0)
   WAITMS(100)
   POSTMESSAGE(WNDFIND("Windows PowerShell"), 0x0100, 0x0D, 0)
   WAITMS(500)
END_SUB

//Укажите интересующий каталог и путь к файлу вывода информации
$dir = "C:\Program Files"
$file = "D:\directory.txt"

//Открыть PowerShell
EXECUTE("C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe")
WAIT(2)

//Вывести имена всех директорий в файл (включая скрытые и системные)
TOCLIP(STRCONCAT("Get-Childitem -Path '", $dir,"' -Recurse -Name -Attributes D,H,S | Out-File ", $file))
down_up()

//Вывести имена всех скрытых файлов в файл
//TOCLIP("Get-Childitem -Path 'C:\Program Files' -Recurse -Name -File -Attributes Hidden | Out-File D:\files.txt")
//down_up()

//Закрыть PowerShell
TOCLIP("exit")
WAITMS(100)
down_up()

Вот простая конструкция без использования циклов и условий. Можно добавлять любые команды PowerShell, как показано на примере получения списка скрытых файлов. Может она и не на 10 строк, но для любителей минимализма можно и сократить, убрав пустые строки, комментарии и т.д.
« Last Edit: May 30, 2020, 01:33:49 PM by Axelenz »
"Можно бесконечно смотреть на три вещи: как течёт вода, как горит огонь и как Clickermann работает вместо тебя..."

intro

  • Зашел в гости
  • *
  • Posts: 16
    • View Profile
Re: Вывод списка подкаталогов в файл
« Reply #10 on: June 07, 2020, 10:35:36 PM »
Axelenz спасибо за помощь и интересный вариант.
Я просто думал что обсуждение темы закончилось. Вот и не заходил.
К сожалению у меня это не работает. Скрипт бесконечно плодит окна PowerShell и всё. Никакие команды он в эти окна не пишет. Может прав не хватает или еще что. Сам с этим не разобрался. :-[

Axelenz

  • Освоившийся
  • **
  • Posts: 31
  • Парсинг сайтов, наполнение интернет-магазинов
    • View Profile
Re: Вывод списка подкаталогов в файл
« Reply #11 on: June 08, 2020, 09:25:59 PM »
У меня работает на Windows 8.1 64 bit ну и соответственно v4.14.002b.
Это часть кода, как минимум, в конце необходимо поставить HALT.
И скорее всего придётся поиграться с задержками...
« Last Edit: June 08, 2020, 09:40:10 PM by Axelenz »
"Можно бесконечно смотреть на три вещи: как течёт вода, как горит огонь и как Clickermann работает вместо тебя..."