Автокликер Clickermann :: Форум
Основной раздел => Общие вопросы => Topic started by: intro on May 16, 2020, 12:45:05 PM
-
Всем доброго времени суток!
Вопрос собственно в названии темы. Столкнулся с такой проблемой, а опыта и знаний не хватает. Нужно вывести в файл имена всех подкаталогов из определенной папки. Команда GETDIRLIST находит папки только на первом уровне. А мне нужен полный список всех вложенных папок, на всю глубину, с путями. Долго бился с циклами и условиями, пока совсем не запутался. :-[
Я только начал осваивать Clickermann. Всякие мелочи уже могу делать сам, но со сложными алгоритмами пока не дружу. Уверен, что для знатоков такой скрипт строк в 10 написать не проблема, а я всю голову сломал. Если кто поможет решить задачку, буду очень благодарен.
Заранее спасибо.
-
Пока ждал помощи здесь, разместил вопрос ешё на паре форумов. Нашелся один умелец. За готовый скрипт он запросил 500 рублей. Говорит, что "алгоритм сложный для понимания и вообще, такое мало кто сможет зделать" и что "это еще не дорого". А сам он якобы уложится в 10 строк кода, включая сортировку и HALT. Верится с трудом. Наверно ищет дурака, чтобы кинуть на бабки. В общем - тут тишина, а там просят денег. ;D
Или на самом деле всё так сложно и дорого? Мне первому чтоли взбрело в голову просканировать вложенные папки? ;D
-
Раньше никому не требовалось. Как сделать чисто на кликермане не знаю.
Вот эта команда в .bat файле выводит содержимое подкаталогов в файл a.txt
dir /a:d /s >> a.txt
-
Вот эта команда в .bat файле выводит содержимое подкаталогов в файл a.txt
dir /a:d /s >> a.txt
Спасибо, :) как вариант тоже пригодится.
-
EXECUTE("cmd.exe", "/C chcp 1251>nul && dir /ad /s /b /on >file.txt")
кодировка файла cp866
Если нужно читать файл кликером можно сделать кодировку 1251
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 раза. Не знаю в чём прикол, но на моей системе при одном повторении кодировка не переключается.
-
...
Нашелся один умелец. За готовый скрипт он запросил 500 рублей. Говорит, что "алгоритм сложный для понимания и вообще, такое мало кто сможет зделать"
...
С каких это пор стал сложным для понимания "тупой" перебор ячеек массива в цикле? ;D Там же нет ничего больше в этом скрипте. Даже условий никаких нет. Все хоть раз такое уже делали. Другое дело, что не всем оно надо, это правда.
Мне вот надо, для раскидывания по папкам сайта файла index.html. Это древняя рекомендация по устранению уязвимости сайтов, для запрета доступа к каталогам. И делал я скрипт для этого. Привожу его просто как пример. Скрипт для Clickermann v4.14, но GETDIRLIST доступен уже в v4.13. Делал для себя, без оптимизаций - работает и ладно. Если из моего скрипта выкинуть всё лишнее, то как раз и останется десяток строк.
Если пример не поможет, могу допилить под данную задачу. Только позже, сейчас нет времени.
#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
-
Вот тебе и 10 строк. По другому вроде и не напишешь.
И всего то - за 490 ₽ (ПандеМайская скидка - 10 ₽). ;D
Для Clickermann v4.13
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
-
Огромное спасибо всем за помощь и исчерпывающие ответы. Хорошая получилась тема.
Все варианты отлично работают и будут полезны не только мне, но и другим новичкам.
Спасибо! :)
-
Огромное спасибо всем за помощь и исчерпывающие ответы. Хорошая получилась тема.
Все варианты отлично работают и будут полезны не только мне, но и другим новичкам.
Спасибо! :)
Да незачто. Обращайся. :D
-
//Подпрограмма вставить данные из буфера в 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 строк, но для любителей минимализма можно и сократить, убрав пустые строки, комментарии и т.д.
-
Axelenz спасибо за помощь и интересный вариант.
Я просто думал что обсуждение темы закончилось. Вот и не заходил.
К сожалению у меня это не работает. Скрипт бесконечно плодит окна PowerShell и всё. Никакие команды он в эти окна не пишет. Может прав не хватает или еще что. Сам с этим не разобрался. :-[
-
У меня работает на Windows 8.1 64 bit ну и соответственно v4.14.002b.
Это часть кода, как минимум, в конце необходимо поставить HALT.
И скорее всего придётся поиграться с задержками...