最终杀死Ruby脚本

时间:2016-04-06 13:56:55

标签: ruby windows

我有一个不可阻挡的Ruby脚本,我需要能够停止。以下是代码:

require 'win32ole'

wsh = WIN32OLE.new("WScript.Shell")

def fileToArray(file)
    x = []
    File.foreach("#{file}") do |line|
        x << line.to_s.split('')
    end
    return x.flatten!
end
tests = fileToArray("C:\\xampp\\htdocs\\x\\Script\\includes\\classes.php")

sleep 10
x = 0
y = tests.length
while x <= y do
    send = tests[x]
    speed = 0.025
    if x == y
        print "Test Complete"
        break()
    #You guys don't need to see this code, it's just detecting what keys are 
    #in the array and reading them to the file. But important to know that it is incrementing based on sent keys
    else
        x += 1
    end
end

我的问题是它读取的classes.php是4,000行,需要很长时间才能通过。如果它搞砸了,我必须等到它完成。除非我完全退出所有内容,否则我无法阻止此循环运行直到完成,CTRL+ALT+DEL选项:Logout。我已尝试curses我在gets上尝试了exitCTRL^C也不起作用。我更倾向于使用书面解决方案,但除此之外,我不会介意知道一些钥匙来杀死过程a.k.a.&#34;杀死它,用钥匙杀死它&#34;

1 个答案:

答案 0 :(得分:0)

你读取数组中的每个字节,如果你让它运行到最后,你的数组会有多长时间?填充数十万的阵列确实需要很长时间。应该看看你的其余代码是否有更好的方法,以及为什么win32ole对象?

如果用于中断慢跑的标准窗口键没有单词(Ctrl-c或Ctrl-break)并且你不能使用taskmanager,那么控制台肯定会响应。

这是一个完成你所做的事情的脚本。我把它放在一个无限循环中,所以我必须终止它。 Process.pid显示进程ID。 提前打开控制台,当您想要终止脚本时,请输入以下内容

taskkill /f /pid 5532

/ f用于强制终止,数字是你从脚本中获得的pid

# encoding:utf-8
STDOUT.sync = true
s1 = File.read __FILE__
puts Process.pid
class String
    def to_a
      while true # endless loop just for testing the kill
        each_byte.inject([]){|result, char| result << char}
      end
    end
end

p s1.to_a

使用Windows 7和Ruby MRI 1.9.3进行测试

编辑: 根据你的评论这里发送密钥到程序的另一种方式 如果我正确理解你想做什么,你也不需要提前拆分字符串。

require 'win32ole'
#for this script Autoit3 must be installed

s1 = "a string of thousands of characters"

# activate the correct window with the appclass
ai.Opt("WinTitleMatchMode", 4)
appClass = "[CLASS:xxxxxxxx]"    # retrieved with AutoIt Window Info 
ai = WIN32OLE.new("AutoItX3.Control")
ai.WinActivate(appClass)

# or with the handle
handle = "[HANDLE:#{ai.wingethandle(appClass)}]" 
ai.WinActivate(handle)

# send keys, controlkeys or words to the program
ai.Send('{HOME}') #you can send control keys like that

s1.each_byte{|char| ai.Send(char); sleep 1} #to send everything char after char

s1[0..10].each_byte{|char| ai.Send(char); sleep 1} #to send the first 10 chars