Jump to content

Recommended Posts

Posted

Hi,

I have generated a batch file i.e. apc_off.bat to control a outlet from a APC PDU, below is the code:

@echo off && setlocal enabledelayedexpansion 

echo/ && cls && color 9F && %__APPDIR__%mode.com 77,30 && set "_temp_vbs=%tmp%\_tmp_file_vbs_.vbs" && >"!_temp_vbs!"^
  (    
   echo= On Error Resume Next
   echo= Set WshShell = WScript.CreateObject("WScript.Shell"^)
   echo= Set ObjShell = WScript.CreateObject("WScript.Shell"^)
   echo= Wsh.sleep 1000 'adjust this timeout for your needs
   echo= ObjShell.AppActivate "MS Telnet CMD" 
   echo= Wsh.sleep 1000
   echo= WshShell.SendKeys "o 192.168.1.104~"
   echo= Wsh.sleep 1000
   echo= WshShell.SendKeys "apc~"
   echo= Wsh.sleep 1000
   echo= WshShell.SendKeys "apc~"
   echo= Wsh.sleep 1000
   echo= WshShell.SendKeys "olOff 1~"
   echo= Wsh.sleep 1000
   echo= WshShell.SendKeys "exit~"
   echo= Wsh.sleep 1000
   echo= WshShell.SendKeys "~"
   echo= Wsh.sleep 1000
   echo= WshShell.SendKeys "^]"
   echo= Wsh.sleep 1000
   echo= WshShell.SendKeys "quit~"
  ) && pushd %windir%\system32\ & title <nul && title MS Telnet CMD

start "" /b "%__APPDIR__%cScript.exe" //nologo "!_temp_vbs!" && call telnet.exe 

:loop
tasklist.exe /nh | findstr.exe /i cscript.exe >nul && goto :loop
2>nul >nul del /q /f "!_temp_vbs!" & popd & endlocal & exit

It will pop a MS CMD window and execute a telnet command to turn on or off the outlet from the APC PDU, and when it is finished, the script will auto terminate the window.

I try to add the apc_off.bat into AutoIT script like below:

#include <ButtonConstants.au3>
#include <EditConstants.au3>
#include <GUIConstantsEx.au3>
#include <GUIListBox.au3>
#include <StaticConstants.au3>
#include <WindowsConstants.au3>
#include <Date.au3>
#include <Process.au3>
#include <Array.au3>
#include <File.au3>
#include <ScreenCapture.au3>
#include <WinAPIFiles.au3>

RunWait(@ComSpec & " /c" & "start " & "/wait" & " " & "apc_off.bat", @WorkingDir, @SW_HIDE)

And try to run it, but I got the error message:

image.png.895bdb2e1a2c38425e90a0ec30836142.png

It is strange because I try to open a cmd window and run the telnet.exe from the same folder of the AutoIT script it is workable, no idea why telnet could not recognized if I run it in AutoIT thru the batch file.

Please help.

Thanks,

Jacky

Posted (edited)

..or

#include "_RunWaitEx.au3" ; https://www.autoitscript.com/forum/topic/139260-autoit-snippets/?do=findComment&comment=1478119
#include <WinAPIFiles.au3>
_WinAPI_Wow64EnableWow64FsRedirection ( False )
ConsoleWrite( _RunWaitEx("telnet /?") & @CRLF)

Edit: may need to #RequireAdmin

Edited by argumentum

Follow the link to my code contribution ( and other things too ).
FAQ - Please Read Before Posting.
autoit_scripter_blue_userbar.png

Posted (edited)

Here what is working for me (seems there is quite a number of limitations starting Telnet from AutoIt) :

#AutoIt3Wrapper_UseX64=y

#include <Constants.au3>

Opt("WinTitleMatchMode", -2)

Run("telnet.exe")
WinWait("Telnet")
Send("?" & @CR)
Send("^a")
Sleep(200)
Send("^c")
MsgBox($MB_OK, "", ClipGet())

ps.  just noticed that you lack a space after /c (but why concatenate multiple strings ?)

RunWait(@ComSpec & " /c start /wait apc_off.bat", @WorkingDir, @SW_HIDE)

 

Edited by Nine
Posted
18 hours ago, Nine said:

Here what is working for me (seems there is quite a number of limitations starting Telnet from AutoIt) :

#AutoIt3Wrapper_UseX64=y

#include <Constants.au3>

Opt("WinTitleMatchMode", -2)

Run("telnet.exe")
WinWait("Telnet")
Send("?" & @CR)
Send("^a")
Sleep(200)
Send("^c")
MsgBox($MB_OK, "", ClipGet())

ps.  just noticed that you lack a space after /c (but why concatenate multiple strings ?)

RunWait(@ComSpec & " /c start /wait apc_off.bat", @WorkingDir, @SW_HIDE)

 

Thanks, but seems it could not auto send keys into telnet cmd window.

I have another solution but it might be stupid.

I made a executable apc_control.exe by below AutoIT code:

#include <Constants.au3>

RunWait(@ComSpec & " /c" & " " & "start " & "/wait" & " " & "apc_onoff.bat" & " " & $CmdLine[1], @WorkingDir, @SW_HIDE)

And, create another batch apc_onoff.bat file with below content:

@echo off && setlocal enabledelayedexpansion 

if {%1}=={on} goto poweron
if {%1}=={off} goto poweroff

:poweron
echo/ && cls && color 9F && %__APPDIR__%mode.com 77,30 && set "_temp_vbs=%tmp%\_tmp_file_vbs_.vbs" && >"!_temp_vbs!"^
  (    
   echo= On Error Resume Next
   echo= Set WshShell = WScript.CreateObject("WScript.Shell"^)
   echo= Set ObjShell = WScript.CreateObject("WScript.Shell"^)
   echo= Wsh.sleep 2000 'adjust this timeout for your needs
   echo= ObjShell.AppActivate "MS Telnet CMD" 
   echo= Wsh.sleep 2000
   echo= WshShell.SendKeys "o 192.168.1.104~"
   echo= Wsh.sleep 2000
   echo= WshShell.SendKeys "apc~"
   echo= Wsh.sleep 2000
   echo= WshShell.SendKeys "apc~"
   echo= Wsh.sleep 2000
   echo= WshShell.SendKeys "olOn 7~"
   echo= Wsh.sleep 2000
   echo= WshShell.SendKeys "olOn 8~"
   echo= Wsh.sleep 2000
   echo= WshShell.SendKeys "exit~"
   echo= Wsh.sleep 2000
   echo= WshShell.SendKeys "~"
   echo= Wsh.sleep 2000
   echo= WshShell.SendKeys "~"
   echo= Wsh.sleep 2000
   echo= WshShell.SendKeys "~"
   echo= Wsh.sleep 2000
   echo= WshShell.SendKeys "quit~"
   echo= WshShell.SendKeys "~"
   echo= Wsh.sleep 2000
   echo= WshShell.SendKeys "quit~"
  ) && pushd %windir%\system32\ & title <nul && title MS Telnet CMD

start "" /b "%__APPDIR__%cScript.exe" //nologo "!_temp_vbs!" && call telnet.exe 

goto loop

:poweroff
echo/ && cls && color 9F && %__APPDIR__%mode.com 77,30 && set "_temp_vbs=%tmp%\_tmp_file_vbs_.vbs" && >"!_temp_vbs!"^
  (    
   echo= On Error Resume Next
   echo= Set WshShell = WScript.CreateObject("WScript.Shell"^)
   echo= Set ObjShell = WScript.CreateObject("WScript.Shell"^)
   echo= Wsh.sleep 2000 'adjust this timeout for your needs
   echo= ObjShell.AppActivate "MS Telnet CMD" 
   echo= Wsh.sleep 2000
   echo= WshShell.SendKeys "o 192.168.1.104~"
   echo= Wsh.sleep 2000
   echo= WshShell.SendKeys "apc~"
   echo= Wsh.sleep 2000
   echo= WshShell.SendKeys "apc~"
   echo= Wsh.sleep 2000
   echo= WshShell.SendKeys "olOff 7~"
   echo= Wsh.sleep 2000
   echo= WshShell.SendKeys "olOff 8~"
   echo= Wsh.sleep 2000
   echo= WshShell.SendKeys "exit~"
   echo= Wsh.sleep 2000
   echo= WshShell.SendKeys "~"
   echo= Wsh.sleep 2000
   echo= WshShell.SendKeys "~"
   echo= Wsh.sleep 2000
   echo= WshShell.SendKeys "~"
   echo= Wsh.sleep 2000
   echo= WshShell.SendKeys "quit~"
   echo= WshShell.SendKeys "~"
   echo= Wsh.sleep 2000
   echo= WshShell.SendKeys "quit~"
  ) && pushd %windir%\system32\ & title <nul && title MS Telnet CMD

start "" /b "%__APPDIR__%cScript.exe" //nologo "!_temp_vbs!" && call telnet.exe 

:loop
tasklist.exe /nh | findstr.exe /i cscript.exe >nul && goto :loop
2>nul >nul del /q /f "!_temp_vbs!" & popd & endlocal & exit

And in main AutoIT script, call the apc_control.exe to turn on/off the PDU outlet port:

RunWait(@ComSpec & " /c" & "apc_control.exe off", @WorkingDir, @SW_HIDE)

I understand it is stupid but since the main AutoIT script is with x86 but not x64 so I need to create a x64 apc_control.exe and call by the main script.

But there is a risk that when telnet cmd window is pop out, if any interruption by human i.e. swith to other window then it will make the auto send key on another window but not the telnet cmd window, how could I make the cmd window hide or even on top screen so that to avoid any interruption?

Thanks.

Posted

I got another way from below link:

 

Tried to update the example code to below one and confirmed it works well, but I don't know how to jump out the 'While' loop.

#Include <INet.Au3>
TcpStartUp ()

$remoteserver = tcpconnect("192.168.1.104", "23") ;client 2 TELNETserver, leave "TCPNameToIP" out if you have IP only. 23 is telnetport.
if $remoteserver = -1 Then Exit

While 1
    sleep ('100');
    $Recv1 = TCPRecv($remoteserver, "1000");1000 means max stringlen.

    $Username = "apc"
    $password = "apc"

    consolewrite($recv1);what the server replies
    If stringinstr($recv1, "User Name :") > 0 Then
        tcpsend($remoteserver, $Username & @crlf)
    Elseif stringinstr($recv1, "Password  :") > 0 then
        tcpsend($remoteserver, $password & @crlf)
    Elseif stringinstr($recv1, "apc>") > 0 then
        tcpsend($remoteserver, "olOn 7" & @crlf)
        sleep ('100')
        tcpsend($remoteserver, "olOn 8" & @crlf)
        sleep ('100')
        tcpsend($remoteserver, "quit" & @crlf)
    Elseif stringinstr($recv1, "Connection to host lost") > 0 then
        msgbox(16,"error","Connection lost to host")
    EndIf
Wend

 

Posted (edited)
1 hour ago, jackylee0908 said:

don't know how to jump out the 'While' loop.

tcpsend($remoteserver, "quit" & @crlf)
ExitLoop

also, 

$Recv1 = TCPRecv($remoteserver, "1000");1000 means max stringlen.
If @error Then ExitLoop

..that should do it.

and:

$Username = "apc"
    $password = "apc"

can be moved outside the loop.


might as well put it together ( for clarity )

#include <INet.Au3>

doTheThing()
Func doTheThing()
    TCPStartup()
    Local $remoteserver = TCPConnect("192.168.1.104", 23) ;client 2 TELNETserver, leave "TCPNameToIP" out if you have IP only. 23 is telnetport.
    If $remoteserver = -1 Then
        TCPShutdown()
        Return
    EndIf
    Local $Recv1, $iSleep = 200, $Username = "apc", $password = "apc"

    While 1
        Sleep($iSleep) ;
        $Recv1 = TCPRecv($remoteserver, 1024)
        If @error Then ExitLoop ; TCPRecv() is not receiving

        ConsoleWrite($Recv1) ;what the server replies
        If StringInStr($Recv1, "User Name :") > 0 Then
            TCPSend($remoteserver, $Username & @CRLF)
        ElseIf StringInStr($Recv1, "Password  :") > 0 Then
            TCPSend($remoteserver, $password & @CRLF)
        ElseIf StringInStr($Recv1, "apc>") > 0 Then
            TCPSend($remoteserver, "olOn 7" & @CRLF)
            Sleep($iSleep)
            TCPSend($remoteserver, "olOn 8" & @CRLF)
            Sleep($iSleep)
            TCPSend($remoteserver, "quit" & @CRLF)
            ExitLoop ; you're done
        ElseIf StringInStr($Recv1, "Connection to host lost") > 0 Then
            MsgBox(16, "error", "Connection lost to host")
            ExitLoop
        EndIf
    WEnd
    TCPCloseSocket($remoteserver)
    $remoteserver = -1
    TCPShutdown()
EndFunc   ;==>doTheThing

 

Edited by argumentum

Follow the link to my code contribution ( and other things too ).
FAQ - Please Read Before Posting.
autoit_scripter_blue_userbar.png

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
  • Recently Browsing   0 members

    • No registered users viewing this page.
×
×
  • Create New...