1 (изменено: sergeiplugatyr, 2014-02-08 10:44:22)

Тема: AHK: Закрыть рабочую папку скрипта

Всем доброго времени суток, есть небольшой вопрос. У меня в определенной папке есть скрипт, нужно чтобы при выполнении  скрипта рабочая папка этого скрипта закрывалась, как это можно реализовать?

Как сказал мой дед - Я твой дед

2

Re: AHK: Закрыть рабочую папку скрипта

Есть встроенная переменная A_WorkingDir.

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

3

Re: AHK: Закрыть рабочую папку скрипта

Это я знаю, а закрыть папку то как?

Как сказал мой дед - Я твой дед

4

Re: AHK: Закрыть рабочую папку скрипта

Попозже напишу.

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

5

Re: AHK: Закрыть рабочую папку скрипта

Можно по-разному понять выражение "закрыть папку". Или в проводнике открыта, это одно дело, или же закрыть на уровне файловой системы, ограничив права доступа.

6

Re: AHK: Закрыть рабочую папку скрипта

Меня даже как-то озадачило, что у teadrinker'a никаких вопросов не возникло.

7

Re: AHK: Закрыть рабочую папку скрипта

Off: да ему проще написать скрипт, где  в одной строке будут выполняться оба действия, чем задумываться о таких мелочах ))

8

Re: AHK: Закрыть рабочую папку скрипта

Irbis пишет:

Можно по-разному понять выражение "закрыть папку". Или в проводнике открыта, это одно дело, или же закрыть на уровне файловой системы, ограничив права доступа.

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

Как сказал мой дед - Я твой дед

9

Re: AHK: Закрыть рабочую папку скрипта

Мне как-то сразу стало понятно, что речь идёт о закрытии окна (видно, экстрасенсорные способности пока не подводят). Другое дело, я был уверен, что зная путь к папке, легко закрыть её окно, т. е. путь с заголовком перепутал.

for item in ComObjCreate("Shell.Application").Windows
{
   Path := SubStr(item.LocationURL, 9)
   StringReplace, Path, Path, /, \, 1
   StringReplace, Path, Path, `%20, % " ", 1
   if (Path = A_WorkingDir)
   {
      WinClose, % "ahk_id" item.hwnd
      item := ""
      break
   }
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

10

Re: AHK: Закрыть рабочую папку скрипта

Спасибо огромное, работает как часы!

Как сказал мой дед - Я твой дед

11 (изменено: serzh82saratov, 2014-04-09 23:28:07)

Re: AHK: Закрыть рабочую папку скрипта

Если в пути есть символы например "[]", то не работает
Подозреваю, что возможны ещё и другие.

У меня пока так:

WinClose, ahk_exe explorer.exe ahk_class CabinetWClass, %Dir%
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

12

Re: AHK: Закрыть рабочую папку скрипта

serzh82saratov пишет:

У меня пока так:

А если открыты две папки с одинаковым названием?
Вот так должно сработать:

WinClose, % "ahk_id" GetFolderHwnd(A_WorkingDir)

GetFolderHwnd(FolderPath)
{
   for item in ComObjCreate("Shell.Application").Windows
   {
      url := SubStr(item.LocationURL, 9)
      StringReplace, url, url, /, \, 1
      url := UriDecode(url)
      if (url = FolderPath && hwnd := item.hwnd)
         Return hwnd
   }
}

UriDecode(Uri, Enc = "UTF-8")
{
   While Pos := RegExMatch(Uri, "i)(%[\da-f]{2})+", Code, A_Index = 1 ? 1 : Pos+Len)
   {
      VarSetCapacity(Var, Len := StrLen(Code)//3, 0)
      StringTrimLeft, Code, Code, 1
      Loop, Parse, Code, `%
         NumPut("0x" . A_LoopField, Var, A_Index - 1, "UChar")
      StringReplace, Uri, Uri, `%%Code%, % StrGet(&Var, Enc)
   }
   Return Uri
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

13

Re: AHK: Закрыть рабочую папку скрипта

А если открыты две папки с одинаковым названием?

Ну это просто:

While WinExist("ahk_exe explorer.exe ahk_class CabinetWClass", Dir)
    WinClose 

У меня проблема в том, что мне нужно как раз не закрывать окно.
А нужно запустить проводник и выделить в нём файл, и вот если окно с папкой в которой файл, уже открыта, то активировать это окно и выделить файл. Пока приходится закрывать:


WinClose, ahk_exe explorer.exe ahk_class CabinetWClass, %Dir%
        Run, explorer /select`, "%FilePath%"

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

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

14

Re: AHK: Закрыть рабочую папку скрипта

serzh82saratov пишет:

Ну это просто:

Не совсем понял, закрыть-то только одну нужно. Как выделить — попозже напишу.

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

15

Re: AHK: Закрыть рабочую папку скрипта

Не совсем понял, закрыть-то только одну нужно.

Так это одну и закрывает:

WinClose, ahk_exe explorer.exe ahk_class CabinetWClass, %Dir%

так что, я тоже 

А если открыты две папки с одинаковым названием

не понял.

Как выделить — попозже напишу.

Спасибо.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

16

Re: AHK: Закрыть рабочую папку скрипта

serzh82saratov пишет:

А если открыты две папки с одинаковым названием

не понял.

Ну вот смотри, предположим, открыты две папки: одна с путём С:\MyFolder, другая E:\MyFolder. Оба окна будут называться MyFolder. Как с помощью представленного тобой кода можно закрыть одну, не закрывая другую?
Вот более простой вариант получения hwnd папки с конкретным путём, без необходимости декодировать url:

Run, % A_WorkingDir
Loop
   Sleep, 100
until hwnd := GetFolderHwnd(A_WorkingDir)
MsgBox, % hwnd

GetFolderHwnd(FolderPath)
{
   for item in ComObjCreate("Shell.Application").Windows
      if (item.Document.Folder.Self.Path = FolderPath)
         Return item.hwnd
}

Выделяем так:

SelectFilePath(FilePath)
{
   for item in ComObjCreate("Shell.Application").Windows
   {
      window := item, ShellFolderView := item.Document
      for item in ShellFolderView.Folder.Items
      {
         if (item.path = FilePath)
         {
            ShellFolderView.SelectItem(item, 1|4)   ; 1 — select the item, 4 — deselect all but the specified item.
            WinActivate, % "ahk_id" hwnd := window.hwnd
            break 2
         }
      }
   }
   if !hwnd
      Run, explorer /select`, "%FilePath%"
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

17

Re: AHK: Закрыть рабочую папку скрипта

Ну вот смотри, предположим, открыты две папки: одна с путём С:\MyFolder, другая E:\MyFolder. Оба окна будут называться MyFolder. Как с помощью представленного тобой кода можно закрыть одну, не закрывая другую?

While WinExist("ahk_exe explorer.exe ahk_class CabinetWClass", Dir)
    WinClose 

Никак нет

Dir = E:\MyFolder

Закроется только E:\MyFolder.
В любом случае

SetTitleMatchMode RegEx

рассудит.

Вот более простой вариант получения hwnd папки с конкретным путём, без необходимости декодировать url:

Круто, Я знал что только teadrinker найдёт нужные методы.

Выделяем так:

Ооо... Класс, давно искал. Большое Спасибо!

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

18

Re: AHK: Закрыть рабочую папку скрипта

А возможно подлечить?
Папка открыта, выбран - файл номер1. Файл который должен выбран - файл номер2. Ок. Запускаем. Файл номер2 выбран выделен, окно проводника не перезапускается! Но, на файле номер1, остаётся полувыделение. Термин полувыделение, будет понятен при тестах.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

19

Re: AHK: Закрыть рабочую папку скрипта

Пробовал сначала:

4 — deselect all but the specified item.

а потом:

1 — select the item

не вышло.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

20

Re: AHK: Закрыть рабочую папку скрипта

serzh82saratov пишет:

Закроется только E:\MyFolder.

Ок, а если такие папки:
D:\MyFolder
D:\MyFolder\MyFolder
Активна в данный момент последняя, закрыть нужно D:\MyFolder.

serzh82saratov пишет:

А возможно подлечить?

SelectFilePath(FilePath)
{
   for item in ComObjCreate("Shell.Application").Windows
   {
      window := item, ShellFolderView := item.Document
      for item in ShellFolderView.Folder.Items
      {
         if (item.path = FilePath)
         {
            ShellFolderView.SelectItem(item, 1|4|16)   ; 1 — select the item, 4 — deselect all but the specified item, 16 — give the item the focus.
            WinActivate, % "ahk_id" hwnd := window.hwnd
            break 2
         }
      }
   }
   if !hwnd
      Run, explorer /select`, "%FilePath%"
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

21

Re: AHK: Закрыть рабочую папку скрипта

Каюсь. Наивно полагал, что так будет всё ок:


SetTitleMatchMode RegEx

run D:\MyFolder
run D:\MyFolder\MyFolder
Sleep 500
  
Dir = D:\MyFolder
While WinExist("ahk_exe explorer.exe ahk_class CabinetWClass", "im`a)^\Q" Dir "\E$")
    WinClose
Return

видимо неправильно понял справку

-----------

Спасибо за доработку!

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

22

Re: AHK: Закрыть рабочую папку скрипта

В справке написано

RegEx (v1.0.45+): Changes WinTitle, WinText, ExcludeTitle, and ExcludeText to be regular expressions.

Но не срабатывает почему-то.

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

23

Re: AHK: Закрыть рабочую папку скрипта

Вот так сработало:

SetTitleMatchMode RegEx

run D:\MyFolder
run D:\MyFolder\MyFolder
Sleep 2000
  
Dir := "D:\MyFolder"
if WinExist("ahk_class CabinetWClass", "\Q" Dir "\E$")
   WinClose

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

24

Re: AHK: Закрыть рабочую папку скрипта

Значит работают некие непонятно\неполноценные шаблоны

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

25

Re: AHK: Закрыть рабочую папку скрипта

Ну да, так что мой способ, имхо, предпочтительнее, он всё-таки определяет окно папки однозначно по адресу.

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

26

Re: AHK: Закрыть рабочую папку скрипта

Так это сразу было очевидно, диалог был интересен только с познавательной стороны. И имхо оправдался познанием заморочек с SetTitleMatchMode RegEx.

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

27

Re: AHK: Закрыть рабочую папку скрипта

Кстати, а что тут означает 2:

break 2

или просто опечатка?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

28

Re: AHK: Закрыть рабочую папку скрипта

Прерывание и своего, и следующего по иерархии цикла (по умолчанию 1).

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

29 (изменено: serzh82saratov, 2014-04-14 11:07:06)

Re: AHK: Закрыть рабочую папку скрипта

Прерывание и своего, и следующего по иерархии цикла (по умолчанию 1).

Понял.

Работает SetTitleMatchMode RegEx, просто был неверный шаблон:


SetTitleMatchMode RegEx

run D:\MyFolder
run D:\MyFolder\MyFolder
Sleep 1100
  
Dir = D:\MyFolder
While WinExist("ahk_exe explorer.exe ahk_class CabinetWClass", "im`a)^.*?: \Q" Dir "\E$")
    WinClose
Return
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

30

Re: AHK: Закрыть рабочую папку скрипта

Ещё вопрос. При запуске файл выделяется. Но, если список длинный, и был выделен последний файл, а наш файл первый, то как сделать так чтобы выделенный файл было видно?

По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

31

Re: AHK: Закрыть рабочую папку скрипта

А, нашёл, нужна восьмёрка:

SelectItem(item, 1|4|16|8)
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

32 (изменено: serzh82saratov, 2014-04-16 17:01:09)

Re: AHK: Закрыть рабочую папку скрипта

Ни с того ни с сего, начало ругатся что "Folder" неизвестное имя... С чего бы. Хотя и выдавая ошибку всё равно дальше работает.

По случаю переделал код, чтобы не перебирать все файлы во всех окнах.


OpenDir(FilePath)    {
    SplitPath, FilePath,, FolderPath  
    for window in ComObjCreate("Shell.Application").Windows
    {
        try if (window.Document.Folder.Self.Path = FolderPath)
        { 
            try for item in window.Document.Folder.Items
            {  
                if (item.path = FilePath)
                {
                    WinActivate, % "ahk_id" window.hwnd
                    window.Document.SelectItem(item, 1|4|16|8)   
                    Return 
                }
            } 
        } 
    }
    Run, explorer /select`, "%FilePath%"
}
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui

33

Re: AHK: Закрыть рабочую папку скрипта

serzh82saratov пишет:

Ни с того ни с сего, начало ругатся что "Folder" неизвестное имя...

Да, это я упустил, что у окна IE (которое тоже относится к Shell) нет такого свойства. Так проще:

SelectFilePath(FilePath)
{
   for item in ComObjCreate("Shell.Application").Windows
   {
      window := item, ShellFolderView := item.Document
      try for item in ShellFolderView.Folder.Items
      {
         if (item.path = FilePath)
         {
            ShellFolderView.SelectItem(item, 1|4|16)   ; 1 — select the item, 4 — deselect all but the specified item, 16 — give the item the focus.
            WinActivate, % "ahk_id" hwnd := window.hwnd
            break 2
         }
      }
   }
   if !hwnd
      Run, explorer /select`, "%FilePath%"
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

34

Re: AHK: Закрыть рабочую папку скрипта

Хотя да, отсеивать лишние окна не помешает, просто посмотрел невнимательно. Но тогда уж, чтобы не получать одни и те же объекты несколько раз, так:

SelectFilePath(FilePath)
{
   SplitPath, FilePath,, Dir
   for window in ComObjCreate("Shell.Application").Windows
   {
      ShellFolderView := window.Document
      
      try if ((Folder := ShellFolderView.Folder).Self.Path != Dir)
         continue
      catch
         continue
      
      for item in Folder.Items
      {
         if (item.Path != FilePath)
            continue
         
         ShellFolderView.SelectItem(item, 1|4|8|16)
         WinActivate, % "ahk_id" window.hwnd
         Return
      }
   }
   Run, explorer /select`, "%FilePath%"
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

35

Re: AHK: Закрыть рабочую папку скрипта

Если в папке, где содержится целевой объект, находится большое количество других объектов (например, это C:\Windows\System32), тогда с указанием SetBatchLines, -1 чувствуется разница в скорости:

SelectFilePath(A_WinDir . "\System32\taskmgr.exe")

SelectFilePath(FilePath)
{
   SetBatchLines, -1
   SplitPath, FilePath,, Dir
   for window in ComObjCreate("Shell.Application").Windows
   {
      ShellFolderView := window.Document
      
      try if ((Folder := ShellFolderView.Folder).Self.Path != Dir)
         continue
      catch
         continue
      
      for item in Folder.Items
      {
         if (item.Path != FilePath)
            continue
         
         WinActivate, % "ahk_id" window.hwnd
         ShellFolderView.SelectItem(item, 1|4|8|16)
         Return
      }
   }
   Run, explorer /select`, "%FilePath%"
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

36

Re: AHK: Закрыть рабочую папку скрипта

Заметил такой баг, так как не показывал этот файл:

MsgBox % FileExist("C:\Windows\System32\SnippingTool.exe")

У меня FileExist не видит этот файл. Хотя с taskmgr.exe из этой папки всё Ок.
Убрав FileExist (из своего кода) также не работало, пока не заменил:

Run, explorer /select`, "%FilePath%"

на:

Run, %A_WinDir%\explorer.exe /select`, "%FilePath%" 
По вопросам возмездной помощи пишите на E-Mail: serzh82saratov@mail.ru Telegram: https://t.me/sergiol982
Win10x64 AhkSpy, Hotkey, ClockGui