1 (изменено: hauk70, 2015-08-17 20:55:53)

Тема: AHK: Создание текcтового документа в текущей директории

Сабж. Нашел вариант в интернете https://gist.github.com/davejamesmiller/1965432
В чем проблема? я получаю строку пути вида "Адрес: путь" так как у меня язык системы русский, у автора он английский и он получает "Adress: path". Я человек не глупый, погуглил синтаксис, попробовал разные варианты, ничего не выходило строка "Адрес: " не удалялась,. При это если я введу такой код

+ открыть спойлер
FullPath := RegExReplace("Адрес: C\Program Files\AHK", "(^Адрес: )", "")

оно вернет правильную строку.

Подскажите что не так.

2

Re: AHK: Создание текcтового документа в текущей директории

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

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

3 (изменено: hauk70, 2015-08-17 20:59:18)

Re: AHK: Создание текcтового документа в текущей директории

Извиняюсь проглядел. Необходимо по хоткею создать пустой текстовый файл в открытой папке, собственно сабж)

4

Re: AHK: Создание текcтового документа в текущей директории

Если только в папках проводника (не на Рабочем столе), тогда так можно:

#IfWinActive, ahk_class CabinetWClass
^!vk4E::  ; Ctrl + Alt + N
   for item in ComObjCreate("Shell.Application").Windows
      continue
   until WinExist("A") = item.hwnd || item := ""
   FolderPath := item.Document.Folder.Self.Path
   
   SplitPath, FolderPath,,,,, Drive
   if InStr(Drive, "::")  {
      MsgBox, Это служебная папка, в ней нельзя создать файл
      Return
   }
   InputBox, UserInput, New File (example: foo.txt),,, 400, 100
   if ErrorLevel
      Return
   
   FileAppend,, %FolderPath%\%UserInput%
   Run, %FolderPath%\%UserInput%
   Return

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

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

5

Re: AHK: Создание текcтового документа в текущей директории

Создание текстового документа на рабочем столе было бы очень хорошим дополнением и так то вводить имя файла не всегда удобно, поэтому что-то такое корректно?


   New File (example: foo.txt)   
   FileAppend,, %FolderPath%\foo.txt
   Run, %FolderPath%\foo.txt

6

Re: AHK: Создание текcтового документа в текущей директории

А работает?
Так можно:

FileName := "NewText"  ; шаблон имени нового файла

^!vk4E::  ; Ctrl + Alt + N
   WinGetClass, class, A
   if (class ~= "Progman|WorkerW")
      FolderPath := A_Desktop
   else  {
      for item in ComObjCreate("Shell.Application").Windows
         continue
      until WinExist("A") = item.hwnd || item := ""
      FolderPath := item.Document.Folder.Self.Path
   }
   if (FolderPath = "")  {
      MsgBox, Активное окно не является окном Проводника
      Return
   }
   SplitPath, FolderPath,,,,, Drive
   if InStr(Drive, "::")  {
      MsgBox, Это служебная папка, в ней нельзя создать файл
      Return
   }
   
   NewFileName := FolderPath "\" FileName ".txt"
   
   While FileExist(NewFileName)  {
      RegExMatch(NewFileName, "i).*\\" FileName " \((\d+)\)\.txt", number)
      NewFileName := FolderPath "\" FileName " (" . (number1 = "" ? 2 : number1 + 1) . ").txt"
   }

   FileAppend,, % NewFileName
   Run, % NewFileName
   Return

Или, чтобы работало только в окнах Проводника и Рабочего стола:

FileName := "NewText"  ; шаблон имени нового файла
SetTitleMatchMode, Regex
Return

#IfWinActive ahk_class (Progman|WorkerW|CabinetWClass)
^!vk4E::  ; Ctrl + Alt + N
   WinGetClass, class, A
   if (class ~= "Progman|WorkerW")
      FolderPath := A_Desktop
   else  {
      for item in ComObjCreate("Shell.Application").Windows
         continue
      until WinExist("A") = item.hwnd || item := ""
      FolderPath := item.Document.Folder.Self.Path
   }
   SplitPath, FolderPath,,,,, Drive
   if InStr(Drive, "::")  {
      MsgBox, Это служебная папка, в ней нельзя создать файл
      Return
   }
   NewFileName := FolderPath "\" FileName ".txt"
   
   While FileExist(NewFileName)  {
      RegExMatch(NewFileName, "i).*\\" FileName " \((\d+)\)\.txt", number)
      NewFileName := FolderPath "\" FileName " (" . (number1 = "" ? 2 : number1 + 1) . ").txt"
   }

   FileAppend,, % NewFileName
   Run, % NewFileName
   Return
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

7

Re: AHK: Создание текcтового документа в текущей директории

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

ЗЫ файлы создаются с пустым именем (".txt"), но порядковый идентификатор добавляется.
ЗЫЫ Зачем столько возни с присвоением нового идентификатора если текущий занят? разве сама виндане уследит за этим?

8

Re: AHK: Создание текcтового документа в текущей директории

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

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

9

Re: AHK: Создание текcтового документа в текущей директории

Код особо не менял
файлы создаются с именами ".txt", "(2).txt", "(3).txt" и тд
Если убрать код на новый идентификатор он будет открывать первый созданный или с таким же именем файл, а не создавать новые. А спросил потому что было интересно.

#SingleInstance force

+SPACE:: 
Winset, Alwaysontop, Toggle, A, 
Return

FileName := "NewText"  ; шаблон имени нового файла

#vk4E::  ; Ctrl + Alt + N
   WinGetClass, class, A
   if (class ~= "Progman|WorkerW")
      FolderPath := A_Desktop
   else  {
      for item in ComObjCreate("Shell.Application").Windows
         continue
      until WinExist("A") = item.hwnd || item := ""
      FolderPath := item.Document.Folder.Self.Path
   }

   if (FolderPath = "")  {
      Return
   }

   SplitPath, FolderPath,,,,, Drive
   if InStr(Drive, "::")  {
      MsgBox, Это служебная папка, в ней нельзя создать файл
      Return
   }
   
   NewFileName := FolderPath "\" FileName ".txt"
   
   While FileExist(NewFileName)  {
      RegExMatch(NewFileName, "i).*\\" FileName " \((\d+)\)\.txt", number)
      NewFileName := FolderPath "\" FileName " (" . (number1 = "" ? 2 : number1 + 1) . ").txt"
   }

   FileAppend,, % NewFileName
   Run, % NewFileName
   Return

10

Re: AHK: Создание текcтового документа в текущей директории

FileName := "NewText"  ; шаблон имени нового файла

должно быть до первой горячей клавиши, иначе не выполняется.

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

11

Re: AHK: Создание текcтового документа в текущей директории

Спасибо, все заработало, сканкоды нужных клавиш нашел и забиндил, тему можно закрывать.

12

Re: AHK: Создание текcтового документа в текущей директории

teadrinker

Приветствую!
Пробовал у себя 2й вариант вашего скрипта, в проводнике работает идеально!
Но как быть, если я постоянно работаю в программе Clover, там работать ничего не хочет : (
Когда нажимаешь комбинацию клавиш на рабочем столе то тишина.
Когда в проводнике (Clover) выходит такое сообщение - Не удается найти указанный файл

http://images.vfl.ru/ii/1453741386/683baa93/11201921_m.png

Смотрел Clover с помощью утилиты ahk (AU3_Spy) процесс (название окна) вроде тот же что и у родного Проводника

http://images.vfl.ru/ii/1453741492/a9595e4f/11201959_m.png

13

Re: AHK: Создание текcтового документа в текущей директории

Оно и не должно работать нигде, кроме обычного проводника, там ведь директива

#IfWinActive ahk_class (Progman|WorkerW|CabinetWClass)

Код рассчитан только на работу с проводником. Уверен, что с программой Clover тоже можно как-то работать, но у меня она не установлена.

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

14

Re: AHK: Создание текcтового документа в текущей директории

FileName := "NewText"  ; шаблон имени нового файла
SetTitleMatchMode, Regex
Return

#IfWinActive ahk_class ((Cabinet|Explore)WClass|Clover_WidgetWin_0)
^!vk4E::  ; Ctrl + Alt + N
   WinGetClass, class, A
   if (class ~= "Progman|WorkerW")
      FolderPath := A_Desktop
   else  {
      for item in ComObjCreate("Shell.Application").Windows
         continue
      until DllCall("GetAncestor", Ptr, WinExist("A"), "UInt", GA_ROOT := 2, Ptr) = item.hwnd || item := ""
      FolderPath := item.Document.Folder.Self.Path
   }
   SplitPath, FolderPath,,,,, Drive
   if InStr(Drive, "::")  {
      MsgBox, Это служебная папка, в ней нельзя создать файл
      Return
   }
	
   NewFileName := FolderPath "\" FileName ".txt"
   
   While FileExist(NewFileName)  {
      RegExMatch(NewFileName, "i).*\\" FileName " \((\d+)\)\.txt", number)
      NewFileName := FolderPath "\" FileName " (" . (number1 = "" ? 2 : number1 + 1) . ").txt"
   }

   FileAppend,, % NewFileName
   Run, % NewFileName
   Return
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

15 (изменено: tregalka, 2016-04-05 20:04:56)

Re: AHK: Создание текcтового документа в текущей директории

teadrinker
Спасибо!!!

16

Re: AHK: Создание текcтового документа в текущей директории

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

17 (изменено: Oleksandr, 2021-04-01 01:34:18)

Re: AHK: Создание текcтового документа в текущей директории

teadrinker пишет:

Так можно:

Очень хороший код. Я его немного дополнил, чтобы создать меню, и делать Копию Файла ( Шаблоны ). Но на GUI, Это не работает из-за того, что "Активное окно не является окном Проводника". Не могли бы вы поправить меня. Заранее благодарю.

q::
Gui 2: +HwndSystemMenu
Gui 2: Font, s16, Consolas
Gui 2: Add, Button, g1 x0 y0 w330 h40, Create .ahk
Gui 2: Add, Button, g2 x0 y40 w330 h40, Create .docx
Gui 2: Show, w330 h80, Create Menu

1:
Example()
Return
2:
Example()
Return

Example() {
OldFile := "Example.ahk"
FileName := "ExampleScript"                           ; шаблон имени нового файла
; NewFileName := FolderPath "\" FileName ".ahk"
   
   WinGetClass, class, A
   if (class ~= "Progman|WorkerW|AutoHotkeyGUI")
      FolderPath := A_Desktop
   else  {
      for item in ComObjCreate("Shell.Application").Windows
         continue
      until WinExist("A") = item.hwnd || item := ""
      FolderPath := item.Document.Folder.Self.Path
   }
   if (FolderPath = "")  {
      MsgBox, Активное окно не является окном Проводника
      Return
   }
   SplitPath, FolderPath,,,,, Drive
   if InStr(Drive, "::")  {
      MsgBox, Это служебная папка, в ней нельзя создать файл
      Return
   }
   
   NewFileName := FolderPath "\" FileName ".ahk"
   
   While FileExist(NewFileName)  {
      RegExMatch(NewFileName, "i).*\\" FileName " \((\d+)\)\.ahk", number)
      NewFileName := FolderPath "\" FileName " (" . (number1 = "" ? 2 : number1 + 1) . ").ahk"
   }

 ;FileAppend,, % NewFileName        ; Create New File
 FileCopy, %OldFile%, %NewFileName%    ; Copy File to FolderPath
 ; Run, % NewFileName               ; Run This File
 Return                       ; The End Script  
}

18

Re: AHK: Создание текcтового документа в текущей директории

Попробуйте так:

Gui, New, % "+AlwaysOnTop +Owner hwndhGui +E" . WS_EX_NOACTIVATE := 0x08000000
Gui, Font, s16, Consolas
Gui, Add, Button, gExample x0 y0 w330 h40 vAHK, Create .ahk
Gui, Add, Button, gExample x0 y40 w330 h40 vDOC, Create .docx
Return

q:: Gui, %hGui%: Show, NA w330 h80, Create Menu

Example() {
   WinGetClass, class, A
   if (class ~= "Progman|WorkerW")
      FolderPath := A_Desktop
   else  {
      for item in ComObjCreate("Shell.Application").Windows
         continue
      until WinExist("A") = item.hwnd || item := ""
      FolderPath := item.Document.Folder.Self.Path
   }
   if (FolderPath = "")  {
      MsgBox, Активное окно не является окном Проводника
      Return
   }
   SplitPath, FolderPath,,,,, Drive
   if InStr(Drive, "::")  {
      MsgBox, Это служебная папка, в ней нельзя создать файл
      Return
   }
   if (A_GuiControl = "AHK")
      MsgBox, 4096, Здесь код для создания AHK, Папка:`n%FolderPath%
   else
      MsgBox, 4096, Здесь код для создания документа, Папка:`n%FolderPath%
   Return
}
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder

19 (изменено: Oleksandr, 2021-04-01 10:24:33)

Re: AHK: Создание текcтового документа в текущей директории

teadrinker
Ваш пример с моим кодом не дружит, пишет else без if..., возможно я что-то не понял..

Я тут немного еще пошаманил, и дополнил свой предыдущий код, что-бы было нагляднее понятно как это работает. Есть 3 файла. Сам скрипт и два шаблона Example.docx, Example.ahk. При создании файла, он просто копируеться и создаеться в той папке, в которой нахожусь.

Так вот.., при создании файла, через раз срабатывает в проводнике., но в основном создает файл на рабочем столе.
Пробовал WinActivate, в проводнике, но это не  сработало.


q::
Gui 2: New, % "+AlwaysOnTop +Owner hwndhGui +E" . WS_EX_NOACTIVATE := 0x08000000
Gui 2: +HwndSystemMenu
Gui 2: Font, s16, Consolas
Gui 2: Add, Button, g1 x0 y0 w330 h40, Create .ahk
Gui 2: Add, Button, g2 x0 y40 w330 h40, Create .docx
Gui 2: Show, w330 h80, Create Menu

1:
ExampleAHK()
Return
2:
ExampleWord()
Return

ExampleAHK() {
OldFile := "Example.ahk"
FileName := "ExampleScript"                           ; шаблон имени нового файла
; NewFileName := FolderPath "\" FileName ".ahk"
   
   WinGetClass, class, A
   if (class ~= "Progman|WorkerW|AutoHotkeyGUI")
      FolderPath := A_Desktop
   else  {
      for item in ComObjCreate("Shell.Application").Windows
         continue
      until WinExist("A") = item.hwnd || item := ""
      FolderPath := item.Document.Folder.Self.Path
   }
   if (FolderPath = "")  {
      MsgBox, Активное окно не является окном Проводника
      Return
   }
   SplitPath, FolderPath,,,,, Drive
   if InStr(Drive, "::")  {
      MsgBox, Это служебная папка, в ней нельзя создать файл
      Return
   }
   
   NewFileName := FolderPath "\" FileName ".ahk"
   
   While FileExist(NewFileName)  {
      RegExMatch(NewFileName, "i).*\\" FileName " \((\d+)\)\.ahk", number)
      NewFileName := FolderPath "\" FileName " (" . (number1 = "" ? 2 : number1 + 1) . ").ahk"
   }

 ;FileAppend,, % NewFileName        ; Create New File
;#WinActivate, ahk class ExploreWClass|CabinetWClass
FileCopy, %OldFile%, %NewFileName%    ; Copy File to FolderPath
;#WinActivate ;
 ; Run, % NewFileName               ; Run This File
 Return                       ; The End Script  
}

ExampleWord() {
OldFile := "Example.docx"
FileName := "Example"                           ; шаблон имени нового файла
; NewFileName := FolderPath "\" FileName ".ahk"
   
   WinGetClass, class, A
    if (class ~= "Progman|WorkerW|AutoHotkeyGUI")
      FolderPath := A_Desktop
   else  {
      for item in ComObjCreate("Shell.Application").Windows
         continue
      until WinExist("A") = item.hwnd || item := ""
      FolderPath := item.Document.Folder.Self.Path
   }
   if (FolderPath = "")  {
      MsgBox, Активное окно не является окном Проводника
      Return
   }
   SplitPath, FolderPath,,,,, Drive
   if InStr(Drive, "::")  {
      MsgBox, Это служебная папка, в ней нельзя создать файл
      Return
   }
   
   NewFileName := FolderPath "\" FileName ".docx"
   
   While FileExist(NewFileName)  {
      RegExMatch(NewFileName, "i).*\\" FileName " \((\d+)\)\.docx", number)
      NewFileName := FolderPath "\" FileName " (" . (number1 = "" ? 2 : number1 + 1) . ").docx"
   }

 ;FileAppend,, % NewFileName        ; Create New File
;#WinActivate, ahk class ExploreWClass|CabinetWClass
FileCopy, %OldFile%, %NewFileName%    ; Copy File to FolderPath
;#WinActivate ;
 ; Run, % NewFileName               ; Run This File
 Return 
}