Скрипт AutoHotkey не вставляет буфер обмена в окно CMD - PullRequest
0 голосов
/ 11 января 2019

Я пытаюсь создать сценарий, который будет ярлыком для создания некоторой структуры папок. В основном у меня есть шаблон .ahk-скрипта, который я адаптировал к своим потребностям, и простой .bat-скрипт, который создает папки, которые мне нужны.

Скрипт .ahk, вызывает скрипт .bat. Проблема заключается в том, что сценарий .ahk помещает местоположение сценария .bat в буфер обмена и должен вставить его в окно cmd, которое открывает .ahk, в каталог, в котором я выполняю ярлык. Однако функция вставки не работает. Терминал CMD показывает следующее:

F:\Documents\Scripts\Template Scripts\Reference Media>v
'v' is  not recognized as an internal or external command, operable program or batch file.

Это мой скрипт .ahk:

SetTitleMatchMode RegEx
return

; Stuff to do when Windows Explorer is open
;
#IfWinActive ahk_class ExploreWClass|CabinetWClass

    ; create new text file
    ;
    #t::Send !fwt

    ; open 'cmd' in the current directory
    ;
    #c::
        OpenCmdInCurrent()
    return
#IfWinActive


; Opens the command shell 'cmd' in the directory browsed in Explorer.
; Note: expecting to be run when the active window is Explorer.
;
OpenCmdInCurrent()
{
    ; This is required to get the full path of the file from the address bar
    WinGetText, full_path, A

    ; Split on newline (`n)
    StringSplit, word_array, full_path, `n

    ; Find and take the element from the array that contains address
    Loop, %word_array0%
    {
        IfInString, word_array%A_Index%, Address
        {
            full_path := word_array%A_Index%
            break
        }
    }  

    ; strip to bare address
    full_path := RegExReplace(full_path, "^Address: ", "")

    ; Just in case - remove all carriage returns (`r)
    StringReplace, full_path, full_path, `r, , all


    IfInString full_path, \
    {
        Run,  cmd /K cd /D "%full_path%"
        WinWait, ahk_exe cmd.exe
        ClipSaved := ClipboardAll ; save the entire clipboard to the variable ClipSaved
        clipboard := ""           ; empty the clipboard (start off empty to allow ClipWait to detect when the text has arrived)
        clipboard = ( call "F:\Documents\Scripts\Template Scripts\CreateFolderTemplate.bat" )            ; copy this text:
        ClipWait, 2              ; wait max. 2 seconds for the clipboard to contain data. 
        if (!ErrorLevel)         ; If NOT ErrorLevel, ClipWait found data on the clipboard
        ;Sleep 250
        Send ^v {Enter}  ; paste the text
        Sleep 300
        clipboard := ClipSaved   ; restore original clipboard
        ClipSaved =              ; Free the memory in case the clipboard was very large.
        return
    }
    else
    {
        Run, cmd /K cd /D "C:\ "
    }
}

И это скрипт .bat, который он вызывает:

@echo off

md Approvals     
md "Behind The Scenes"
md "Client Notes"
md "Delivery/YYYY-DD-MM"
md "Other Media"
md "Personal Notes"
md "Project Files"/"Capture One"
md "Project Media (if applicable"
md "Production Media"
md "Reference Media"
cd "Production Media"
md "Media From Client"
md "Other Media"

Сложная часть скрипта .ahk: Send ^v {Enter}

Я не могу понять, почему он не вставляет его автоматически. Когда я нажимаю ctrl + v вручную, он вставляет строку и выполняет сценарий .bat, как и положено.

Я пытался сделать это с помощью Send {Ctrl down} {v} {Ctrl up} {enter}, он по-прежнему возвращает ту же строку в окне cmd.

Есть идеи для решения?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 15 января 2019

Я согласен, что лучше включить все в один скрипт. Но вот маленький кусочек о окне CMD. Если щелкнуть правой кнопкой мыши строку заголовка и выбрать «изменить», у вас есть возможность вставить. Кроме того, я не уверен, всегда ли он работал таким образом (до Win10), но просто щелкнуть правой кнопкой мыши в открытом пространстве и вставить.

0 голосов
/ 12 января 2019

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

Вот грязный сценарий, если кому-то это понадобится однажды.

SetTitleMatchMode RegEx
return

; Stuff to do when Windows Explorer is open
;
#IfWinActive ahk_class ExploreWClass|CabinetWClass

    ; open 'cmd' in the current directory
    ;
    #c::
        MakeFoldersInCurrent()
    return
#IfWinActive


; Note: expecting to be run when the active window is Explorer.
;
MakeFoldersInCurrent()
{
    ; This is required to get the full path of the file from the address bar
    WinGetText, full_path, A

    ; Split on newline (`n)
    StringSplit, word_array, full_path, `n

    ; Find and take the element from the array that contains address
    Loop, %word_array0%
    {
        IfInString, word_array%A_Index%, Address
        {
            full_path := word_array%A_Index%
            break
        }
    }  

    ; strip to bare address
    full_path := RegExReplace(full_path, "^Address: ", "")

    ; Just in case - remove all carriage returns (`r)
    StringReplace, full_path, full_path, `r, , all


    IfInString full_path, \
    {
        WinWait, ahk_exe 
        FileCreateDir %full_path%\Approvals
        FileCreateDir %full_path%\Behind The Scenes
        FileCreateDir %full_path%\Client Notes
        FileCreateDir %full_path%\Delivery\YYYY-MM-DD
        FileCreateDir %full_path%\Other Media
        FileCreateDir %full_path%\Personal Notes
        FileCreateDir %full_path%\Production Media\Media From Client
        FileCreateDir %full_path%\Production Media\Other Media
        FileCreateDir %full_path%\Project Files\Capture One
        FileCreateDir %full_path%\Project Files\Photoshop
        FileCreateDir %full_path%\Project Media
        FileCreateDir %full_path%\Reference Media
        clipboard := ""           ; empty the clipboard (start off empty to allow ClipWait to detect when the text has arrived)
        clipboard = "%full_path%\Project Files\Capture One"            ; copy this text in clipboard // I need it to paste in CaptureOne directly.
        ClipWait, 2              ; wait max. 2 seconds for the clipboard to contain data. // Not sure if necessary at all.
        if (!ErrorLevel)         ; If NOT ErrorLevel, ClipWait found data on the clipboard
        Sleep 300
        return
    }
    else
    {
        return ; not sure if else clause is needed at all.
    }
}
...