1

Тема: AHK: Run CMD с заготовленной командой

Есть .bat с командной, но через "горячие клавиши", бывает, не срабатывает. Решил поискать макросы и наткнулся на AHK.
По-изучав форум, смог разобраться по мелочи, но на моменте с вносом команды в cmd застрял.


^q::
run, *runas cmd ,,hide

Вот, что мне удалось.
Нужно что б открывалась cmd в hide и вносилась команда, но как это реализовать, не могу найти и тем похожих нет.


set tempdate=%date:~-10%
date 14.06.2021
timeout 5
date %tempdate%

Команда в .bat

2

Re: AHK: Run CMD с заготовленной командой

Я в cmd не силён, можете описать, что именно этот код делает? Возможно, cmd здесь лишнее.
Ну, или можно просто по горячей клавише запускать bat-файл.

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

3

Re: AHK: Run CMD с заготовленной командой

teadrinker
Сейчас 30.07.2021. Код меняет дату на, допустим, 27.07.2021, затем ждет 5 секунд и возвращает дату обратно на 30.07.2021.
Я писал выше, что иногда не срабатывает и приходится несколько раз нажимать горячую клавишу, ahk с этим справляется гораздо лучше, судя по тому, что я написал выше.

4

Re: AHK: Run CMD с заготовленной командой

Не совсем понял «иногда не срабатывает и приходится несколько раз нажимать горячую клавишу». В каком смысле не срабатывает? Горячую клавишу через AHK устанавливали? Может, как-то неверно установили? Вот так

^q:: MsgBox, Работает!

работает? Если да, то так же и bat-файл можно запустить.

Дату можно менять и без cmd, если задача именно в этом. В любом случае, чтобы вызвать команды через cmd, не обязательно посылать их в окно консоли. Например:

tempdate := CmdRet("cmd /c echo %date:~-10%")
CmdRet("cmd /c date 14.06.2021")
Sleep 5000
CmdRet("cmd /c date " . tempdate)

CmdRet(sCmd, callBackFunc := "", encoding := "")
{
   static flags := [HANDLE_FLAG_INHERIT := 0x1, CREATE_NO_WINDOW := 0x8000000], STARTF_USESTDHANDLES := 0x100
        
   (encoding = "" && encoding := "cp" . DllCall("GetOEMCP", "UInt"))
   DllCall("CreatePipe", "PtrP", hPipeRead, "PtrP", hPipeWrite, "Ptr", 0, "UInt", 0)
   DllCall("SetHandleInformation", "Ptr", hPipeWrite, "UInt", flags[1], "UInt", flags[1])
   
   VarSetCapacity(STARTUPINFO , siSize :=    A_PtrSize*9 + 4*8, 0)
   NumPut(siSize              , STARTUPINFO)
   NumPut(STARTF_USESTDHANDLES, STARTUPINFO, A_PtrSize*4 + 4*7)
   NumPut(hPipeWrite          , STARTUPINFO, siSize - A_PtrSize*2)
   NumPut(hPipeWrite          , STARTUPINFO, siSize - A_PtrSize)
   
   VarSetCapacity(PROCESS_INFORMATION, A_PtrSize*2 + 4*2, 0)
   if !DllCall("CreateProcess", "Ptr", 0, "Str", sCmd, "Ptr", 0, "Ptr", 0, "UInt", true, "UInt", flags[2]
                              , "Ptr", 0, "Ptr", 0, "Ptr", &STARTUPINFO, "Ptr", &PROCESS_INFORMATION)
   {
      DllCall("CloseHandle", "Ptr", hPipeRead)
      DllCall("CloseHandle", "Ptr", hPipeWrite)
      throw "CreateProcess is failed"
   }
   DllCall("CloseHandle", "Ptr", hPipeWrite)
   VarSetCapacity(sTemp, 4096), nSize := 0
   while DllCall("ReadFile", "Ptr", hPipeRead, "Ptr", &sTemp, "UInt", 4096, "UIntP", nSize, "UInt", 0) {
      sOutput .= stdOut := StrGet(&sTemp, nSize, encoding)
      ( callBackFunc && %callBackFunc%(stdOut) )
   }
   DllCall("CloseHandle", "Ptr", NumGet(PROCESS_INFORMATION))
   DllCall("CloseHandle", "Ptr", NumGet(PROCESS_INFORMATION, A_PtrSize))
   DllCall("CloseHandle", "Ptr", hPipeRead)
   Return sOutput
}

Не знаю, что именно даёт :~-10.

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

5

Re: AHK: Run CMD с заготовленной командой

teadrinker
Спасибо огромное! Сейчас попробую и отпишусь.
А по поводу %, добавление с %date:~-10% десятого и девятого символов справа от текущей даты locale, которая является месяцем.

6

Re: AHK: Run CMD с заготовленной командой

teadrinker
Что-то я не понял, как этот большой код работает. Я скомпилил его через ahk2exe, запустил и ничего, так же добавил горячую клавишу в начале и тоже ничего, а скрипт msgbox работает, но он выводит сообщение просто и все

7

Re: AHK: Run CMD с заготовленной командой

Скриптом с горячей клавишей можете запускать свой bat-файл:

^q:: Run D:\Folder\MyFile.bat
skipper-si пишет:

запустил и ничего

А чего вы ожидали? Он на 5 секунд меняет системное время. Чтобы проверить, можете увеличить 5000 (это в милисекундах). Никаких сообщений он не должен выводить. Хотя, для теста можно добавить сообщение сюда:

MsgBox, % tempdate := CmdRet("cmd /c echo %date:~-10%")
Разработка AHK-скриптов:
e-mail dfiveg@mail.ru
Telegram jollycoder