1 (изменено: baplo, 2018-05-21 21:23:47)

Тема: AHK: открыть .bat файл под Hide и отправлять в него команды.

Здравствуйте!
Прошу помощи.

Недавно разобрался как с помощью .bat файла подключиться к FTP серверу, при этом оставив окно .bat файла активным.

Собственно.. что я хочу?

Хочу сделать так, чтобы при запуске AHK файла, вместе с ним запускался этот самый .bat файл, но так, что бы его окно было скрытым, чтобы он не мешал в дальнейшем моим действиям.

и второе:

Хочу узнать, как в этот скрытый .bat файл, отправлять некие команды, в моем случае
mput путь файла

Upd:

Наткнулся на новую проблему при отправке Controlsend в командную строку:

ControlSend, , {blind} get ppp.ini %T% {enter}, ahk_pid %PID2%

Если не устанавливать {blind}, то при каждой отправке у меня будет отжиматься шифт в активном окне.
А если поставить, то шифт будет зависать и тупо не отжиматься при отжатие.


Можно ли как то решить эту проблему?
Нужно сделать так, чтобы в командную строку посылался текст get ppp.ini и нажимался enter и чтобы в активном окне, мой шифт или ктрл не отжимался или не зависал.
Как это можно сделать иначе?Неужели нет вариантов выхода?

есть ли пути решения?

Люблю когда мне понижают репутацию (мне правда все равно)

2 (изменено: baplo, 2018-05-21 21:23:01)

Re: AHK: открыть .bat файл под Hide и отправлять в него команды.

Я разобрался сам как решить эту проблему.

Я написал следующий код:


Run, ftp_put.bat, Hide ; правда под Хайдом он все равно не запускается, но это уже не проблема
sleep, 500
WinGet, PID2, PID , C:\windows\system32\cmd.exe ; узнаем PID процесса этого .bat файла

Return

F1::
{
ControlSend, , mput D:\Temp\2.txt {ENTER}, ahk_pid %PID2% ; отправить в неактивное окно текст mput D:\Temp\2.txt 
                                                                                             ; и нажать ENTER
Sleep, 500
}
Люблю когда мне понижают репутацию (мне правда все равно)

3 (изменено: svoboden, 2018-05-21 03:32:31)

Re: AHK: открыть .bat файл под Hide и отправлять в него команды.

Читайте про команду RunWait. А если так уж нужно через ControlSend (ConsoleSend), то вот: https://autohotkey.com/board/topic/25446-consolesend/.

4

Re: AHK: открыть .bat файл под Hide и отправлять в него команды.

svoboden пишет:

Читайте про команду RunWait. А если так уж нужно через ControlSend (ConsoleSend), то вот: https://autohotkey.com/board/topic/25446-consolesend/.

Люблю когда мне понижают репутацию (мне правда все равно)

5 (изменено: baplo, 2018-05-21 21:21:58)

Re: AHK: открыть .bat файл под Hide и отправлять в него команды.

svoboden пишет:

Читайте про команду RunWait. А если так уж нужно через ControlSend (ConsoleSend), то вот: https://autohotkey.com/board/topic/25446-consolesend/.

Наткнулся на проблему при отправке Controlsend в командную строку:

ControlSend, , {blind} get ppp.ini %T% {enter}, ahk_pid %PID2%

Если не устанавливать {blind}, то при каждой отправке у меня будет отжиматься шифт в активном окне.
А если поставить, то шифт будет зависать и тупо не отжиматься при отжатие.


Можно ли как то решить эту проблему?
Нужно сделать так, чтобы в командную строку посылался текст get ppp.ini и нажимался enter и чтобы в активном окне, мой шифт или ктрл не отжимался или не зависал.
Как это можно сделать иначе?Неужели нет вариантов выхода?

Люблю когда мне понижают репутацию (мне правда все равно)

6 (изменено: svoboden, 2018-05-21 20:10:07)

Re: AHK: открыть .bat файл под Hide и отправлять в него команды.

baplo пишет:

Как это можно сделать иначе?Неужели нет вариантов выхода?

Используйте библиотеку LibCon, хоть я и не проверял ее.
https://autohotkey.com/boards/viewtopic … onsoleSend.

7 (изменено: baplo, 2018-05-21 21:24:57)

Re: AHK: открыть .bat файл под Hide и отправлять в него команды.

svoboden пишет:

Используйте библиотеку LibCon, хоть я и не проверял ее.

Мне кажется я вообще не смогу разобраться, как она работает, без четких примеров.
Я даже не понимаю, что она мне даст.

Люблю когда мне понижают репутацию (мне правда все равно)

8

Re: AHK: открыть .bat файл под Hide и отправлять в него команды.

baplo, уберите избыточное цитирование из своих сообщений!
http://forum.script-coding.com/viewtopi … 10#p125510

http://forum.script-coding.com/viewtopi … 14#p125514
Оформите код специальным тегом!
http://forum.script-coding.com/viewtopi … 81#p125481

9

Re: AHK: открыть .bat файл под Hide и отправлять в него команды.

ypppu

Готово.

Люблю когда мне понижают репутацию (мне правда все равно)

10

Re: AHK: открыть .bat файл под Hide и отправлять в него команды.

baplo, а зачем вам необходимо управлять фтп через бат?

11 (изменено: baplo, 2018-05-22 10:56:32)

Re: AHK: открыть .bat файл под Hide и отправлять в него команды.

Malcev пишет:

baplo, а зачем вам необходимо управлять фтп через бат?

Я хочу создать связь между двумя компьютерами, посредством передачи файла .ini
Один компьютер передает файл на сервер, при нажатие горячей клавиши, другой постоянно пытается его загрузить.
Как только на FTP сервер поступает этот файл, второй его может загрузить и, прочитав этот файл, издать звуковой сигнал.
После этого, второй компьютер удаляет файл с компьютера и FTP сервера и снова пытается его загрузить.

Я бы хотел узнать, как можно запускать скрытый cmd и чтобы при открытие этой консоли, он автоматически прописывал команды, которые записаны в .txt формат.


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

И так же просто пытаться, циклически, запускать cmd, логиниться и пытаться скачать файл и выходить из консоли.


Я не знаю как еще гуманнее сделать этот макрос, судя по ответам на форуме, мне неактивно помогают, я уже не знаю что и делать :c


Я пробовал controlSend, но он мешает активному окну, т.к идут траблы с модификаторами, а если указывать {blind} , то модификаторы могут зависнуть в активном состояние, даже если физически клавиша была отжата.


Вот темы, где ответа я так и не получил:

http://forum.script-coding.com/viewtopic.php?id=13726
http://forum.script-coding.com/viewtopic.php?id=13715

Люблю когда мне понижают репутацию (мне правда все равно)

12

Re: AHK: открыть .bat файл под Hide и отправлять в него команды.

https://github.com/jNizM/AHK_Scripts/tr … er/src/ftp

13 (изменено: baplo, 2018-05-24 09:08:10)

Re: AHK: открыть .bat файл под Hide и отправлять в него команды.

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

Сам код:


FTPCommandFile = \FTPCommands.txt
FTPLogFile = \FTPLog.txt
FileDelete %FTPCommandFile% ; На случай, если предыдущий запуск был прерван преждевременно.
FTPSaveFile = D:\CMDV\LoadP.ini

FileAppend,
(
open xxxxxx
xxxxxx
xxxxxx
Get Load.ini %FTPSaveFile%
!
EXIT
Get Load.ini %FTPSaveFile%

quit
), %FTPCommandFile%

RunWait %comspec% /c ftp.exe -s:"%FTPCommandFile%" >"%FTPLogFile%",, Show

; Run %FTPLogFile% ; Открыть лог-файл для просмотра.

что за интересная команда?А вот, конкретно восклицательный знак:


Get Load.ini %FTPSaveFile%
!
EXIT
Get Load.ini %FTPSaveFile%

что он делает?Он дает возможность временно перейти в командную строку, то есть, из FTP > CMD, но когда FTP вводит этот знак он получает строку:

Microsoft Windows [Version 6.1.7601]
(c) Корпорация Майкрософт (Microsoft Corp.), 2009. Все права защищены.

и на этом, FTPCommands.txt - перестает читать последующие команды.

У меня вопрос:

Можно ли как то автоматизировать этот переход?Он мне нужен, чтобы я смог устанавливать паузу/задержку, между отправками команды в FTP?

+ открыть спойлер

P.S
Еще нашел вот этот код, может ли мне кто нибудь тут помочь из этого кода вырвать кусок, который бы:
1. Коннект к FTP
2. Загрузка файла из сервера в путь D:\pp.ini
3. Sleep, 2000 задержка 2 секунды
4. проверить, загрузился ли файл, если да
{
Выполнить команду
}
Else
5. повторить пункт 2 и так по кругу

вот код какой нашел:


;; FTP Class Example - http://www.autohotkey.com/forum/viewtopic.php?t=73544
;; Synchronous mode example

;;== USER SETTINGS ===============
Server     := "ftp.autohotkey.net"
UserName   := "my_username"
Password   := "my_password"
UploadFile := "D:\Temp\Test.zip"
;;== END USER SETTINGS ===========


#Include FTP.ahk

ftp1 := new FTP()
ftp1 ? TTip("InternetOpen Success") : Quit("Could not load module/InternetOpen")

; connect to FTP server
ftp1.Open(Server, UserName, Password) ? TTip("Connected to FTP") : Quit(ftp1.LastError)

; get current directory
sOrgPath := ftp1.GetCurrentDirectory()
sOrgPath ? TTip("GetCurrentDirectory : " sOrgPath) : Msg(ftp1.LastError)
  
; create a new directory 'testing'
ftp1.CreateDirectory("testing") ? TTip("Created Directory ""testing""") : Msg(ftp1.LastError)

; set the current directory to 'root/testing'
ftp1.SetCurrentDirectory("testing") ? TTip("SetCurrentDirectory ""testing""") : Msg(ftp1.LastError)

; upload this script file
ftp1.PutFile(A_ScriptFullPath, A_ScriptName) ? TTip("PutFile success!") : Msg(ftp1.LastError)

; rename script to 'mytestscript.ahk'
ftp1.RenameFile(A_ScriptName, "MyTestScript.ahk") ? TTip("RenameFile success!") : Msg(ftp1.LastError)

; enumerate the file list from the current directory ('root/testing')
TTip("Enumerating files in directory ""/testing/""")
item := ftp1.FindFirstFile("/testing/*")
MsgBox % "Name : " . item.Name
 . "`nCreationTime : " . item.CreationTime
 . "`nLastAccessTime : " . item.LastAccessTime
 . "`nLastWriteTime : " . item.LastWriteTime
 . "`nSize : " . item.Size
 . "`nAttribs : " . item.Attribs
Loop
{
  if !(item := ftp1.FindNextFile())
    break
  MsgBox % "Name : " . item.Name
   . "`nCreationTime : " . item.CreationTime
   . "`nLastAccessTime : " . item.LastAccessTime
   . "`nLastWriteTime : " . item.LastWriteTime
   . "`nSize : " . item.Size
   . "`nAttribs : " . item.Attribs
}

; retrieve the file from the FTP server
ftp1.GetFile("MyTestScript.ahk", A_ScriptDir . "\MyTestScript.ahk", 0) ? TTip("GetFile success!") : Msg(ftp1.LastError)

; delete the file from the FTP server
ftp1.DeleteFile("MyTestScript.ahk") ? TTip("DeleteFile success!") : Msg(ftp1.LastError)

; upload a file with progress
ftp1.InternetWriteFile( UploadFile ) ? TTip("InternetWriteFile success!") : Msg(ftp1.LastError)

; download a file with progress
SplitPath,UploadFile,fName,,fExt
ftp1.InternetReadFile( fName , "delete_me." fExt) ? TTip("InternetReadFile success!") : Msg(ftp1.LastError)

; delete the file
ftp1.DeleteFile( fName )  ? TTip("DeleteFile success!") : Msg(ftp1.LastError)

; set the current directory back to the root
ftp1.SetCurrentDirectory(sOrgPath) ? TTip("SetCurrentDirectory to original path: success!") : Msg(ftp1.LastError)

; remove the direcrtory 'testing'
ftp1.RemoveDirectory("testing") ? TTip("RemoveDirectory ""\testing"" success!") : Msg(ftp1.LastError)

; close the FTP connection, free library
ftp1 := ""    ;__Delete called
MsgBox, 64, Success, Tests successfully completed!, 3
ExitApp


Quit(Message="") {
	if Message
		MsgBox, 16, Error!, %Message%, 5
	ExitApp
}

Msg(Message="") {
	MsgBox, 64, , %Message%, 5
}

TTip(Message="") {
	ToolTip %Message%
}
Люблю когда мне понижают репутацию (мне правда все равно)

14

Re: AHK: открыть .bat файл под Hide и отправлять в него команды.

baplo пишет:

Я не знаю как с этим нужно работать.

Там 2 функции аплоад и даунлоад, в каждой из них есть пример вызова.
Что там может быть непонятного?

15

Re: AHK: открыть .bat файл под Hide и отправлять в него команды.

Malcev пишет:
baplo пишет:

Я не знаю как с этим нужно работать.

Там 2 функции аплоад и даунлоад, в каждой из них есть пример вызова.
Что там может быть непонятного?

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

Люблю когда мне понижают репутацию (мне правда все равно)

16

Re: AHK: открыть .bat файл под Hide и отправлять в него команды.

Приведите код.

17

Re: AHK: открыть .bat файл под Hide и отправлять в него команды.

Malcev, [Не по теме] Гляньте тему, пожалуйста. Очень нужен ответ. http://forum.script-coding.com/viewtopic.php?id=13736

18 (изменено: baplo, 2018-05-25 23:55:03)

Re: AHK: открыть .bat файл под Hide и отправлять в него команды.

Malcev пишет:

Приведите код.

; ===============================================================================================================================
; Download Files from FTP Server (Server, Username, Password, RemoteFile, LocalFile)
; ===============================================================================================================================

FTPDownload(93.189.41.9, user48935, 1xaIc7U9P4dQ, dd.ini, D:\CMDV\dd.ini)
{
    static a := "AHK-FTP-DL"
    if !(m := DllCall("LoadLibrary", "str", "wininet.dll", "ptr")) || !(h := DllCall("wininet\InternetOpen", "ptr", &a, "uint", 1, "ptr", 0, "ptr", 0, "uint", 0, "ptr"))
        return 0
    if (f := DllCall("wininet\InternetConnect", "ptr", h, "ptr", &srv, "ushort", 21, "ptr", &usr, "ptr", &pwd, "uint", 1, "uint", 0x08000000, "uptr", 0, "ptr")) {
        if !(DllCall("wininet\FtpGetFile", "ptr", f, "ptr", &rfile, "ptr", &lfile, "int", 0, "uint", 0, "uint", 0, "uptr", 0))
            return 0, DllCall("wininet\InternetCloseHandle", "ptr", h) && DllCall("FreeLibrary", "ptr", m)
        DllCall("wininet\InternetCloseHandle", "ptr", f)
    }
    DllCall("wininet\InternetCloseHandle", "ptr", h) && DllCall("FreeLibrary", "ptr", m)
    return 1
}

; ===============================================================================================================================

FTPDownload("Тут я ввожу сервер ip", "Тут я ввожу Логин", "Тут я ввожу пароль", "dd.ini", "D:\CMDV\dd.ini")

вот что вылезает при запуске:
https://i.imgur.com/yI27CWU.png

Люблю когда мне понижают репутацию (мне правда все равно)

19

Re: AHK: открыть .bat файл под Hide и отправлять в него команды.

А зачем вы вписали свои значения в функцию?

FTPDownload(93.189.41.9, user48935, pass, dd.ini, D:\CMDV\dd.ini)
{

20

Re: AHK: открыть .bat файл под Hide и отправлять в него команды.

Malcev пишет:

А зачем вы вписали свои значения в функцию?

FTPDownload(93.189.41.9, user48935, pass, dd.ini, D:\CMDV\dd.ini)
{

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

Я не слишком умный в этом вопросе.

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

Вообщем, я тупо не понимаю как работать с этим скриптом и подобные вопросы я думаю должны быть очевидными).


Я лучше понимаю код на практике, исключая что то лишнее или добавляя свое, либо когда мне демонстрируют рабочий код и уже его, изменяя, я понимаю как и что работает, но в данном случаее мой код просто не запускается)


Вот изначальная строчка

FTPDownload("example.net", "username", "password", "testfile.txt", "C:\Temp\testfile.txt")

С ней скрипт запускается, но он через секунд 15 вырубается.

И спрашивается, что произошло?

Люблю когда мне понижают репутацию (мне правда все равно)

21

Re: AHK: открыть .bat файл под Hide и отправлять в него команды.

Скачался файл.
У меня с вашим логином и паролем файл с вашего фтп скачивается.

22

Re: AHK: открыть .bat файл под Hide и отправлять в него команды.

Для вашего случая нужно сначала удостовериться, что файл на фтп есть, потом его скачать и стереть.
Как-то так:

srv := "google.com"
usr := "login"
pwd := "pass"
rfile := "1.txt"
lfile := "C:\1.txt"

m := DllCall("LoadLibrary", "str", "wininet.dll", "ptr")
loop
{
   h := DllCall("wininet\InternetOpen", "str", "AHK-FTP-DL", "uint", 1, "ptr", 0, "ptr", 0, "uint", 0, "ptr")
   f := DllCall("wininet\InternetConnect", "ptr", h, "ptr", &srv, "ushort", 21, "ptr", &usr, "ptr", &pwd, "uint", 1, "uint", 0x08000000, "uptr", 0, "ptr")
   VarSetCapacity(lpFindFileData, 1140, 0)
   if DllCall("wininet\FtpFindFirstFile", "ptr", f, "ptr", &rfile, "ptr", &lpFindFileData, "uint", 0)
   {
      DllCall("wininet\FtpGetFile", "ptr", f, "ptr", &rfile, "ptr", &lfile, "int", 0, "uint", 0, "uint", 0, "uptr", 0)
      DllCall("wininet\FtpDeleteFile", "ptr", f, "ptr", &rfile)
   }
   VarSetCapacity(lpFindFileData, 0)
   DllCall("wininet\InternetCloseHandle", "ptr", h)
   sleep 50
}
DllCall("FreeLibrary", "ptr", m)