我有一个不可阻挡的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
上尝试了exit
。 CTRL^C
也不起作用。我更倾向于使用书面解决方案,但除此之外,我不会介意知道一些钥匙来杀死过程a.k.a.&#34;杀死它,用钥匙杀死它&#34;
答案 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