1

Тема: AHK: Адрес файла

Доброго времени суток.
Есть ли возможность через ахк как-то реализовать нахождение полного пути к файлу, зная его название или часть пути.
Например я знаю что  есть папка 123 в ней папка 345 и файл  test.ahk, нужно получить полный путь файла test.ahk с диском и т.д.

2

Re: AHK: Адрес файла

Перебирайте файлы в папке с помощью Loop, Files, пока не найдётся соответствие по названию или части пути.

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

3 (изменено: seriyforum, 2018-06-19 01:31:54)

Re: AHK: Адрес файла

Loop, file , \AutoHotkey\Compiler\ANSI 32-bit.bin
	msgbox , %file%

Что-то такое сделал, но как видимо это не правильно.
Помогите правильно распределить параметры, в справке не очень понятно.

4

Re: AHK: Адрес файла

Во-первых, должен быть указан точный путь к папке, внутри которой находится искомый файл, иначе скрипту придётся перебирать все папки на компьютере, а это займёт много времени. Во-вторых, внутри цикла нужно проверять только значения переменных, специально предназначенных для цикла обхода файлов.

seriyforum пишет:

Например я знаю что  есть папка 123 в ней папка 345 и файл  test.ahk

В этом случае нужно ещё знать путь к папке 123.

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

5

Re: AHK: Адрес файла

Например, у нас есть папка C:\Program Files\AutoHotkey, где-то внутри которой есть файл ANSI 32-bit.bin. Тогда полный путь к нему можно найти так:

SetBatchLines, -1
startFolder := "C:\Program Files\AutoHotkey"
wantedFile := "ANSI 32-bit.bin"

Loop, files, %startFolder%\*, FR
{
   if (A_LoopFileName = wantedFile)  {
      MsgBox, % A_LoopFileFullPath
      break
   }
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg

6

Re: AHK: Адрес файла

teadrinker, а как можно быть в ситуации, когда известна лишь часть имени искомого файла? К примеру, такая — *.(2QBgg6ntZcRKQ).*.

7

Re: AHK: Адрес файла

В смысле, папка не известна?

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

8

Re: AHK: Адрес файла

Известна папка, но неизвестно полное имя файла, а лишь часть.

9

Re: AHK: Адрес файла

...
if InStr(A_LoopFileName, ".(2QBgg6ntZcRKQ).")
   MsgBox, % A_LoopFileFullPath
...
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Skype dmitry_fiveg
+ DD

10 (изменено: DD, 2018-06-19 04:00:46)

Re: AHK: Адрес файла

Правильно ли я все записал? —

SetBatchLines, -1
startFolder := "C:\Program Files\AutoHotkey"
wantedFile := "32-bit.bin"

Loop, files, %startFolder%\*, FR
{
   if InStr(A_LoopFileName, wantedFile)  {
      MsgBox, % A_LoopFileFullPath
      break
   }
}

11

Re: AHK: Адрес файла

Нет.

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

12

Re: AHK: Адрес файла

Исправил, спасибо.

13 (изменено: serzh82saratov, 2018-06-19 04:12:32)

Re: AHK: Адрес файла

Если не искать в WinDir, то где то 1.5-2 сек обходит все три диска, у каждого по разному конечно.


#NoEnv
SetBatchLines, -1
ListLines Off

targetdir = 123\345
targetfile = test.ahk

DriveGet, list, list

Loop, Parse, list
	Loop, files, %A_LoopField%:\*, D  ; лишний цикл, экономит время в WinDir
	{ 
		If (A_WinDir = A_LoopFileFullPath)
			Continue  
		Loop, files, %A_LoopFileFullPath%\*, DR
		{   
			if (A_LoopFileFullPath ~= "i)\Q" targetdir "\E$")
			{
				Loop, files, %A_LoopFileFullPath%\%targetfile%, F
					matches .= A_LoopFileFullPath "`n"
			}
		} 
	} 
MsgBox % matches

Смысл в том что зная имя папки, не надо читать все файлы.

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.29.01 (Unicode 32-bit).

14

Re: AHK: Адрес файла

Это разве что на свежекупленном компьютере за 2 сек, я даже дождаться завершения цикла не смог. Кроме того, в реальности в подобном коде ещё права доступа учитывать нужно.

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

15

Re: AHK: Адрес файла

Ну это же должно быть быстрее чем перебор файлов.
А права доступа на что могут повлиять?

По вопросам возмездной помощи пишите письма
E-Mail: serzh82saratov@mail.ru
OS: Win7x64, AutoHotkey_L v1.1.29.01 (Unicode 32-bit).

16

Re: AHK: Адрес файла

Если действительно важна скорость, то я бы воспользовался Everything:
https://autohotkey.com/boards/viewtopic … 13#p118613

17

Re: AHK: Адрес файла

serzh82saratov пишет:

А права доступа на что могут повлиять?

Не будет перебирать файлы в папках, в которые нет доступа. Запуск от имени администратора, вроде, помогает.

Malcev пишет:

Если действительно важна скорость, то я бы воспользовался Everything

Как раз вчера её скачал. Действительно, быстро ищет. Единственный недостаток — при поиске по словам в содержании текстовых файлов нет возможности быстро просмотреть их содержимое с выделением найденных слов. Даже подумал, а не доработать ли.

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

18

Re: AHK: Адрес файла

Можно предложить им добавить этот функционал:
http://voidtools.com/forum/viewforum.php?f=4

19

Re: AHK: Адрес файла

Можно, но, учитывая количество предложений, самому быстрее будет.

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

20

Re: AHK: Адрес файла

Ух ты через пять лет узнаю что и по содержанию ищет. Наверно в последних версиях добавили.

21 (изменено: DD, 2018-06-20 03:56:35)

Re: AHK: Адрес файла

Про поиск по содержанию тоже узнаю через пять лет)). Кстати, удобно вызывать вот такие шаблоны по WeelUp в строке ввода:

+ открыть спойлер
#IfWinActive, ahk_class EVERYTHING
;-----------------------------------------------------------------------------
~WheelUp::
;-----------------------------------------------------------------------------
Menu, mEverythingQuickPopup, Add, Искать в определённой папке, ES_001
Menu, mEverythingQuickPopup, Add, Искать в определённой папке`, на указанном уровне вложенности, ES_002
Menu, mEverythingQuickPopup, Add, Искать скрытые файлы и папки в указанной папке, ES_003
Menu, mEverythingQuickPopup, Add, Искать слово целиком, ES_004
Menu, mEverythingQuickPopup, Add, Найти файлы размером более 10 МБ, ES_005
Menu, mEverythingQuickPopup, Add, Найти файлы с расширением avi размером более 1 ГБ, ES_006
Menu, mEverythingQuickPopup, Add, Найти файлы`, модифицированные сегодня, ES_007
Menu, mEverythingQuickPopup, Add, Найти файлы`, созданные в указанный день, ES_008
Menu, mEverythingQuickPopup, Add, Найти папки`, которые содержат объекты`, созданные за последний час, ES_009
Menu, mEverythingQuickPopup, Add, Найти все файлы/папки`, в имени которых имеется сочетание ABC`, а в пути — сочетание XYZ, ES_010
Menu, mEverythingQuickPopup, Add, Только Файлы с ABC в имени`, с XYZ в пути, ES_011
Menu, mEverythingQuickPopup, Add, Только Папки с ABC в имени`, с XYZ в пути, ES_012
Menu, mEverythingQuickPopup, Add, Искать на указанных дисках, ES_013
Menu, mEverythingQuickPopup, Add, Искать файлы jpg и png на диске D:\, ES_014
Menu, mEverythingQuickPopup, Add, Искать пустые папки, ES_015
Menu, mEverythingQuickPopup, Add, Искать дубликаты имен файлов, ES_016
Menu, mEverythingQuickPopup, Add, Искать файлы и папки без расширения, ES_017
Menu, mEverythingQuickPopup, Add, Все файлы из C:\ но без файлов из Windows, ES_018

  MouseGetPos,, yMouse, WinID, Control
  If (Control = "Edit1") {
    CreateMenu("mEverythingQuickPopup", EverythingQuickPopup, "1QuickPopupRun")
    CoordMode, ToolTip, Screen
    ToolTip, :: EverythingQuickPopup ::,0,0
    Menu mEverythingQuickPopup, Show
    tooltip
  }
  Return
#IfWinActive

1QuickPopupRun:
  ControlGetText, Text, Edit1, ahk_class EVERYTHING
  ControlSetText, Edit1, %A_ThisMenuItem%%Text%, ahk_class EVERYTHING
  ControlFocus, Edit1, ahk_class EVERYTHING
Return


ES_001:
;Как искать в определённой папке?
ControlSetText, Edit1, madonna E:\Music, ahk_class EVERYTHING
WinSetTitle, ahk_class EVERYTHING,, %A_ThisMenuItem% ; изменяем заголовок окна
Return
ES_002:
;искать в определённой папке, на указанном уровне вложенности
ControlSetText, Edit1, madonna E:\Music parents:2, ahk_class EVERYTHING
WinSetTitle, ahk_class EVERYTHING,, %A_ThisMenuItem%
Return
ES_003:
;Искать скрытые файлы и папки в указанной папке:
ControlSetText, Edit1, c:\MyDocs attrib:H, ahk_class EVERYTHING
WinSetTitle, ahk_class EVERYTHING,, %A_ThisMenuItem%
Return
ES_004:
;искать слово целиком (cat, но не catalog, application и т.п.)
ControlSetText, Edit1, ww:cat, ahk_class EVERYTHING
WinSetTitle, ahk_class EVERYTHING,, %A_ThisMenuItem%
Return
ES_005:
;найти файлы размером более 10 МБ
ControlSetText, Edit1, size:>10mb, ahk_class EVERYTHING
WinSetTitle, ahk_class EVERYTHING,, %A_ThisMenuItem%
Return
ES_006:
;найти файлы с расширением avi размером более 1 ГБ
ControlSetText, Edit1, ext:avi size:>1gb или *.avi size:>1gb, ahk_class EVERYTHING
WinSetTitle, ahk_class EVERYTHING,, %A_ThisMenuItem%
Return
ES_007:
;найти файлы, модифицированные сегодня
ControlSetText, Edit1, rc:today, ahk_class EVERYTHING
WinSetTitle, ahk_class EVERYTHING,, %A_ThisMenuItem%
Return
ES_008:
;найти файлы, созданные в указанный день
ControlSetText, Edit1, dc: 22.11.2015, ahk_class EVERYTHING
WinSetTitle, ahk_class EVERYTHING,, %A_ThisMenuItem%
Return
ES_009:
;найти папки, которые содержат объекты, созданные за последний час
ControlSetText, Edit1, child:* dc:last1hours, ahk_class EVERYTHING
WinSetTitle, ahk_class EVERYTHING,, %A_ThisMenuItem%
Return
ES_010:
;найти все файлы/папки, в имени которых имеется сочетание ABC, а в пути — сочетание XYZ:
ControlSetText, Edit1, path:XYZ nopath:ABC, ahk_class EVERYTHING
WinSetTitle, ahk_class EVERYTHING,, %A_ThisMenuItem%
Return
ES_011:
;Только файлы по тому же условию:
ControlSetText, Edit1, path:XYZ nopath:ABC file:, ahk_class EVERYTHING
WinSetTitle, ahk_class EVERYTHING,, %A_ThisMenuItem%
Return
ES_012:
;Только папки по тому же условию:
ControlSetText, Edit1, path:XYZ nopath:ABC folder:, ahk_class EVERYTHING
WinSetTitle, ahk_class EVERYTHING,, %A_ThisMenuItem%
Return
ES_013:
;Искать на указанных дисках:
ControlSetText, Edit1, <d:|e:> *.mp3, ahk_class EVERYTHING
WinSetTitle, ahk_class EVERYTHING,, %A_ThisMenuItem%
Return
ES_014:
;Искать файлы jpg и png на диске D:
ControlSetText, Edit1, d: <*.jpg|*.png>, ahk_class EVERYTHING
WinSetTitle, ahk_class EVERYTHING,, %A_ThisMenuItem%
Return
ES_015:
;искать пустые папки
ControlSetText, Edit1, empty:, ahk_class EVERYTHING
WinSetTitle, ahk_class EVERYTHING,, %A_ThisMenuItem%
Return
ES_016:
;искать дубликаты имен файлов
ControlSetText, Edit1, dupe:, ahk_class EVERYTHING
WinSetTitle, ahk_class EVERYTHING,, %A_ThisMenuItem%
Return
ES_017:
;Искать файлы и папки без расширения:
ControlSetText, Edit1, !., ahk_class EVERYTHING
WinSetTitle, ahk_class EVERYTHING,, %A_ThisMenuItem%
Return
ES_018:
;Искать файлы и папки без расширения:
ControlSetText, Edit1, C:\ !C:\windows, ahk_class EVERYTHING
WinSetTitle, ahk_class EVERYTHING,, %A_ThisMenuItem%
Return
;Пробел играет роль логической связки И. Поэтому для поиска имени файла или папки, содержащего пробел, нужно заключать строку поиска в двойные кавычки. Например, запрос "Мой документ" выдаст все объекты с точным вхождением, а запрос Мой документ выдаст все объекты, имена которых содержат указанные слова в любом порядке и на любом расстоянии.
;| (вертикальная черта) — логическая связка ИЛИ
;! (восклицательный знак) — отрицание
;<> (угловые скобки) — группировка. Можно в опциях включить группировку круглыми скобками.
#IfWinActive

CreateMenu(_menuName, _menuDef, _menuLabel)
{
   Loop Parse, _menuDef, `n
   {
      If (Mod(A_Index, 2) = 1) ; Odd
      {
         Menu %_menuName%, Add, %A_LoopField%, %_menuLabel%
      }
   }
}