1

Тема: AHK: переименование файла в Windows (выделение имени без расширения)

Когда только попал на этот форум, видел тут скрипт, позволяющий переименовывать файл в Windows (двойной клик или F2), не выделяя расширение.
Т.е. выделяем файл, нажимаем F2, и скрипт выделяет только имя файла, не затрагивая расширение.
Не могу найти эту тему на форуме. Если не удалили ее, поделитесь ссылкой.

2

Re: AHK: переименование файла в Windows (выделение имени без расширения)

Темы такой не помню (это не значит, что её нет).
Разные версии Windows ведут себя по-разному при нажатии F2 в Проводнике, вроде. Т.е. где-то будет выделено всё имя, а где-то — имя без расширения.
А вообще, наверное, можно послать клавиши: F2, затем Home, затем Ctrl+Shift+End, затем Ctrl+Shift+Left, затем Shift+Left.

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

3

Re: AHK: переименование файла в Windows (выделение имени без расширения)

Да. Именно так это и было реализовано. Можно и самому написать. Просто я вспомнил, что была такая тема, и хотел воспользоваться уже готовым решением.

4

Re: AHK: переименование файла в Windows (выделение имени без расширения)

The gray Cardinal пишет:

А вообще, наверное, можно послать клавиши: F2, затем Home, затем Ctrl+Shift+End, затем Ctrl+Shift+Left, затем Shift+Left.

А что при этом должно происходить? Попробовал - выделить имя без расширения не получилось.

5

Re: AHK: переименование файла в Windows (выделение имени без расширения)

F2

Начать переименование файла/папки в Проводнике.

Home

Перейти в начало имени, одновременно сняв выделение.

Ctrl+Shift+End

Выделить до конца текста.

Ctrl+Shift+Left

Убрать выделение с расширения.

Shift+Left

Убрать дополнительно выделение с точки.

К сожалению, для Проводника точка не является границей слова , т.е., «Ctrl+Shift+Left» отрабатывает не так, как ожидалось. Наверное, придётся считать с конца — до точки.

6

Re: AHK: переименование файла в Windows (выделение имени без расширения)

alexii пишет:

К сожалению, для Проводника точка не является границей слова , т.е., «Ctrl+Shift+Left» отрабатывает не так, как ожидалось. Наверное, придётся считать с конца — до точки.

Блин, действительно. Тогда нужно забирать в буфер всё имя, разбирать его в коде посимвольно (искать точку с конца), а затем посылать «Shift+Left» или что-там ещё уже столько раз, сколько нужно.

Кстати, в случае больших значков и клавиша Home тоже может сработать не так как нужно, видимо.

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

7

Re: AHK: переименование файла в Windows (выделение имени без расширения)

Что за большие значки?

8

Re: AHK: переименование файла в Windows (выделение имени без расширения)

Для выделения имени файла пользуюсь таким:

!1::
   i = 0
   ControlGetFocus, Control, A
   if InStr(Control, "Edit")
      ControlGetText, FileName, %Control%, A
   else 
   {
      WinGet, ControlList, ControlList, A
      Loop, parse, ControlList, `n
         if InStr(A_LoopField, "Edit")
            i++
      Send {F2}
      Sleep, 50  ; на всякий случай, у меня работает и без этого
      ControlGetText, FileName, % "Edit" ++i, A
   }
   FileNameNoExt := RegExReplace(FileName, "(.*)\..*", "$1")
   NameLengh := StrLen(FileNameNoExt)
   SendInput, ^{Home}+{Right %NameLengh%}
   Return
InFlames пишет:

Что за большие значки?

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

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

9

Re: AHK: переименование файла в Windows (выделение имени без расширения)

teadrinker пишет:

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

Именно.

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

10

Re: AHK: переименование файла в Windows (выделение имени без расширения)

А вот так надёжнее, и без посыла клавиш, кроме F2:

!1::
   i := k := 0
   ControlGetFocus, Control, A
   if InStr(Control, "Edit")
      ControlGetText, FileName, %Control%, A
   else 
   {
      WinGet, ControlList, ControlList, A
      Loop, parse, ControlList, `n
         if InStr(A_LoopField, "Edit")
            i++
      Send {F2}
      While k - i != 1
      {
         Sleep, 50
         k := 0
         WinGet, ControlList, ControlList, A
         Loop, parse, ControlList, `n
            if InStr(A_LoopField, "Edit")
               k++
      }
      Control = Edit%k%
      ControlGetText, FileName, %Control%, A
   }
   FileNameNoExt := RegExReplace(FileName, "(.*)\..*", "$1")
   NameLengh := StrLen(FileNameNoExt)
   SendMessage, EM_SETSEL := 0xB1, 0, NameLengh, %Control%, A
   Return
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

11

Re: AHK: переименование файла в Windows (выделение имени без расширения)

Отлично работает, но если в имени папки есть точка, то скрипт выделяет всё до точки. Как определить, что выделенный элемент папка?

12

Re: AHK: переименование файла в Windows (выделение имени без расширения)

Наверно, только так:

!1::
   Clipboard =
   Send ^{vk43}
   ClipWait
   MsgBox, % InStr(FileExist(Clipboard), "D") ? "Папка" : "Файл"
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

13

Re: AHK: переименование файла в Windows (выделение имени без расширения)

InFlames, с точки зрения корректности — всё верно: папка тоже может иметь расширение. Единственное, что отличает папку от файла — один атрибут. В принципе, всё, что находится после последней точки — и есть расширение.

14

Re: AHK: переименование файла в Windows (выделение имени без расширения)

Вот, что в итоге получилось

SetTitleMatchMode, 2 
SendMode, input
GroupAdd, RenameGroup
GroupAdd, RenameGroup, Program Manager ahk_class Progman
GroupAdd, RenameGroup, ahk_class CabinetWClass

#IfWinActive ahk_group RenameGroup
$F2::
   Islnk:=0
   Clipboard =
   Send ^{vk43}
   ClipWait
   IsDir := InStr(FileExist(Clipboard), "D") ? 1 : 0
   If (not IsDir) and (RegExReplace(Clipboard, ".*\.(.*)", "$1")="lnk")
         Islnk:=1
   If (IsDir or IsLnk)
  {
    send {F2}
    return
  }
   i := k := 0
   ControlGetFocus, Control, A
   if InStr(Control, "Edit")
      ControlGetText, FileName, %Control%, A
   else 
   {
      WinGet, ControlList, ControlList, A
      Loop, parse, ControlList, `n
         if InStr(A_LoopField, "Edit")
            i++
      Send {F2}
      While k - i != 1
      {
         Sleep, 15
         k := 0
         WinGet, ControlList, ControlList, A
         Loop, parse, ControlList, `n
            if InStr(A_LoopField, "Edit")
               k++
      }
      Control = Edit%k%
      ControlGetText, FileName, %Control%, A
   }
   FileNameNoExt := RegExReplace(FileName, "(.*)\..*", "$1")
   NameLengh := StrLen(FileNameNoExt)
   SendMessage, EM_SETSEL := 0xB1, 0, NameLengh, %Control%, A
   Return