1 (изменено: BlackCat, 2021-03-12 18:25:38)

Тема: AHK: Поиск файлов по списку из текстового файла

Добрый день всем!
Пытаюсь сделать скрипт, который будет искать файлы, имена которых находятся в текстовом файле.
Повод: это универсальный метод поиска нужных директорий и фалов, т.к. гораздо быстрее отредактировать текстовой файл, чем редактировать весь скрипт.
К тому же, он может быть скомпилирован в *.exe файл, который не поддается редактированию штатными средствами.
К примеру, файл списка "List.txt" содержит следующие имена файлов:

EULA.txt
ListDevices.txt
setup.cfg
setup.exe

Такой код для поиска имеющихся в списке файлов работает:

List := "List.txt"

Loop read, % List
	{
	Loop % SourceDir "\*", 0, 1
		{
		If (A_LoopFileName = A_LoopReadLine){
			Files .= A_LoopFileName "`n"
			}
		}
	}
	
msgbox % Files

Следующая конструкция, которая по идее должна исключить эти файлы из поиска, не работает:

List := "List.txt"

Loop read, % List
	{
	Loop % SourceDir "\*", 0, 1
		{
		If (A_LoopFileName != A_LoopReadLine) {
			Files .= A_LoopFileName "`n"
			}
		}
	}
	
msgbox % Files

Не подскажете, в чем причина и как правильно сделать срипт, который будет исключать из поиска файлы в списке?
Признателен за любую помощь!

2 (изменено: Alectric, 2021-03-10 21:11:41)

Re: AHK: Поиск файлов по списку из текстового файла

Цикловые переменные (A_Loop* или A_Index) действительны в пределах только одного цикла (то есть в пределах фигурных скобок). Чтобы использовать их во "вложенном" цикле - нужно присвоить их содержимой другой переменной и использовать ее.

List := "List.txt"

Loop read, % List
  {
  tmpvar:=A_LoopReadLine
  Loop % SourceDir "\*", 0, 1
    {
    If (A_LoopFileName != tmpvar) {
      Files .= A_LoopFileName "`n"
      }
    }
  }
  
msgbox % Files

Код не проверял, просто для примера.

Win 10 x64
AHK
                       Справка AHK v1 тебе в помощь.

3

Re: AHK: Поиск файлов по списку из текстового файла

Alectric благодарю за ответ, но результат тот же, что и с моим кодом.

4 (изменено: BlackCat, 2021-03-11 22:40:09)

Re: AHK: Поиск файлов по списку из текстового файла

В общем, на исключение файлов из поиска, имена которых находятся в текстовом файле, работает этот код:

ExludeList := "ExludeList.txt"

Exlude := []
Loop read, % ExludeList
	{
	Exlude.push(A_LoopReadLine)
	}
	
Loop % SourceDir "\*", 0, 1
	{
	Found := 0
	For Each, Filename in Exlude
	If (Filename = A_LoopFileName){
		Found := 1
		}
	If (!Found){
		Files .= A_LoopFileName "`n"
		}
	}
	
MsgBox % Files

Может кому пригодится.
Единственный недостаток - почему-то не понимает кириллицу, хотя текстовой файл списка в UTF-8

5

Re: AHK: Поиск файлов по списку из текстового файла

Думаю, так должно сработать:

Exclude := {}, Files := ""
FileRead, ExludeList, ExludeList.txt

Loop, parse, ExludeList, `n, `r
   Exclude[A_LoopField] := ""

Loop, Files, %SourceDir%\*, R
   if !Exclude.HasKey(A_LoopFileName)
      Files .= A_LoopFileName . "`n"
   
MsgBox, % Files
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

6

Re: AHK: Поиск файлов по списку из текстового файла

teadrinker, хорошая попытка, но такая же фигня - русские названия не воспринимает.
Т.е., если в списке есть файл, напр. "Новый текстовый документ.txt" и он есть в директории поиска, то он все-равно отображается в msgbox.
Суть проблемы понял - изменил кодировку файла списка с UTF-8 на виндовую 1251 и все заработало.
Но все-равно спасибо за помощь!

7

Re: AHK: Поиск файлов по списку из текстового файла

BlackCat пишет:

русские названия не воспринимает

Если не воспринимает, значит кодировка списка была UTF-8-RAW, то-есть без BOM. Измените на UTF-8 с BOM или добавьте явно кодировку в скрипт первой строчкой:

FileEncoding, UTF-8

и всё будет ок.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

8 (изменено: BlackCat, 2021-03-12 17:06:25)

Re: AHK: Поиск файлов по списку из текстового файла

teadrinker, ну да, так и есть!
Для написания скриптов AHK использую Notepad++ со всеми интересными мне плагинами и подсветкой синтаксиса AHK
По-умолчанию он создает текстовые файлы в кодировке UTF-8 БЕЗ BOM
Тогда какой смысл использовать кодировку UTF-8 с BOM, если можно просто зафигачить весь список в кодировку 1251 - файл, созданный средствами винды???
... конечно, можно в настойках Notepad++ установить нужную кодировку для новых файлов, но .... лень, да и не каждый захочет или поймет, как это сделать ... в любом случае должна присутствовать "страховка от дурака".
Ничего универсального для чтения всех кодировок придумать невозможно? - В этом вопросе я пока zero.

9

Re: AHK: Поиск файлов по списку из текстового файла

Для данного случая подойдёт и cp 1251, точнее это скорее всего ANSI, но иногда требуется сохранить Unicode-символы, которых нет в ANSI, в таких случаях и нужна кодировка UTF-8. Например, такой скрипт сохранить в ANSI не получится:

MsgBox, ø ¼ š

Поэтому просто поставьте по умолчанию кодировку UTF-8 с BOM.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

10

Re: AHK: Поиск файлов по списку из текстового файла

BlackCat пишет:

Ничего универсального для чтения всех кодировок придумать невозможно?

Нет, кодировка текстового файла определяется только по BOM, если её нет, то считается, что кодировка ANSI.

Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

11

Re: AHK: Поиск файлов по списку из текстового файла

teadrinker ОК, понял.
Благодарю за работу и помощь!
Буду копать далее ...

12 (изменено: BlackCat, 2021-03-12 17:53:48)

Re: AHK: Поиск файлов по списку из текстового файла

teadrinker ... кстати, сразу видно Мастера - у Вас код короче получился
Спасибо!

13

Re: AHK: Поиск файлов по списку из текстового файла

Ещё короче:

Files := ""
FileRead, ExludeList, ExludeList.txt

Loop, Files, %SourceDir%\*, R
   if !RegExMatch(ExludeList, "m`a)^\Q" . A_LoopFileName . "\E$")
      Files .= A_LoopFileName . "`n"
   
MsgBox, % Files
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder