vmopt 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.gitignore +17 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +22 -0
- data/README.md +29 -0
- data/Rakefile +1 -0
- data/bin/devcon +0 -0
- data/bin/vmdrive +97 -0
- data/bin/vmdvd +193 -0
- data/bin/vmnetwork +172 -0
- data/bin/vmnotepad +144 -0
- data/bin/vmopt +22 -0
- data/bin/vmpower +73 -0
- data/bin/vmserial +92 -0
- data/bin/vmsysres +58 -0
- data/lib/vmopt.rb +14 -0
- data/lib/vmopt/disk_operation.rb +188 -0
- data/lib/vmopt/dvd_operation.rb +120 -0
- data/lib/vmopt/ext/string_ext.rb +104 -0
- data/lib/vmopt/network.rb +128 -0
- data/lib/vmopt/notepad.rb +145 -0
- data/lib/vmopt/power_operation.rb +57 -0
- data/lib/vmopt/serialport_operation.rb +62 -0
- data/lib/vmopt/system_resource.rb +44 -0
- data/lib/vmopt/utils/ip.rb +287 -0
- data/lib/vmopt/utils/registry.rb +13 -0
- data/lib/vmopt/utils/wmi.rb +19 -0
- data/lib/vmopt/version.rb +3 -0
- data/lib/vmopt/windows/win_net.rb +295 -0
- data/lib/vmopt/windows/win_winutils.rb +200 -0
- data/vmopt.gemspec +37 -0
- metadata +170 -0
@@ -0,0 +1,120 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
require "vmopt/utils/wmi"
|
3
|
+
require "au3"
|
4
|
+
require "Win32API"
|
5
|
+
module Vmopt
|
6
|
+
class DVDOperation
|
7
|
+
=begin
|
8
|
+
参数:无
|
9
|
+
功能:获取光驱的基本信息
|
10
|
+
返回值:默认
|
11
|
+
=end
|
12
|
+
def get_dvd_information()
|
13
|
+
data_value={}
|
14
|
+
colItems = WMI.execquery ("select * from Win32_CDROMDrive")
|
15
|
+
for colItem in colItems do
|
16
|
+
str={"介质类型"=>colItem.MediaType,
|
17
|
+
"盘符"=> colItem.Drive,
|
18
|
+
"描述信息"=>colItem.Description
|
19
|
+
}
|
20
|
+
data_value["#{colItem.Drive}"]=str
|
21
|
+
end
|
22
|
+
return data_value
|
23
|
+
end
|
24
|
+
|
25
|
+
=begin
|
26
|
+
参数:无
|
27
|
+
功能:弹出光驱
|
28
|
+
返回值:默认
|
29
|
+
=end
|
30
|
+
def eject_dvd(str1="set cdauto door open",str2="",num1=0,num2=0)
|
31
|
+
mci = Win32API.new("winmm.dll","mciSendString",%w(p p i i),"i")
|
32
|
+
mci.call(str1,str2,num1,num2)
|
33
|
+
end
|
34
|
+
|
35
|
+
=begin
|
36
|
+
参数:无
|
37
|
+
功能:关闭光驱与弹出光驱对应
|
38
|
+
返回值:默认
|
39
|
+
=end
|
40
|
+
def close_dvd(str1="set cdauto door closed",str2="",num1=0,num2=0)
|
41
|
+
mci = Win32API.new("winmm.dll","mciSendString",%w(p p i i),"i")
|
42
|
+
mci.call(str1,str2,num1,num2)
|
43
|
+
end
|
44
|
+
|
45
|
+
=begin
|
46
|
+
参数:无
|
47
|
+
功能:禁用系统所有的光驱设备
|
48
|
+
返回值:默认
|
49
|
+
=end
|
50
|
+
def disable_all_dvd
|
51
|
+
system("devcon.exe disable *DVD* >null 2>&1")
|
52
|
+
end
|
53
|
+
|
54
|
+
=begin
|
55
|
+
参数:盘符号例如D:
|
56
|
+
功能:禁用指定盘符的光驱设备
|
57
|
+
返回值:默认
|
58
|
+
=end
|
59
|
+
def disable_index_dvd(str)
|
60
|
+
colItems = WMI.execquery ("select * from Win32_CDROMDrive where Drive='#{str}'")
|
61
|
+
for colItem in colItems do
|
62
|
+
strID = colItem.DeviceId
|
63
|
+
system("devcon.exe disable @#{strID} >null 2>&1")
|
64
|
+
end
|
65
|
+
end
|
66
|
+
|
67
|
+
=begin
|
68
|
+
参数:无
|
69
|
+
功能:启用系统所有的光驱设备
|
70
|
+
返回值:默认
|
71
|
+
=end
|
72
|
+
def enable_all_dvd
|
73
|
+
system("devcon.exe enable *DVD* >null 2>&1 ")
|
74
|
+
end
|
75
|
+
|
76
|
+
|
77
|
+
=begin
|
78
|
+
参数:无
|
79
|
+
功能:删除或卸载统所有的光驱设备
|
80
|
+
返回值:默认
|
81
|
+
=end
|
82
|
+
def remove_all_dvd
|
83
|
+
system("devcon.exe remove *DVD* >null 2>&1")
|
84
|
+
end
|
85
|
+
|
86
|
+
=begin
|
87
|
+
参数:盘符号例如D:
|
88
|
+
功能:删除或卸载指定盘符的光驱设备
|
89
|
+
返回值:默认
|
90
|
+
=end
|
91
|
+
def remove_index_dvd(str)
|
92
|
+
colItems = WMI.execquery ("select * from Win32_CDROMDrive where Drive='#{str}'")
|
93
|
+
for colItem in colItems do
|
94
|
+
strID = colItem.DeviceId
|
95
|
+
system("devcon.exe remove @#{strID} >null 2>&1")
|
96
|
+
end
|
97
|
+
end
|
98
|
+
=begin
|
99
|
+
参数:无
|
100
|
+
功能:自动添加或者挂载所有光驱设备
|
101
|
+
返回值:默认
|
102
|
+
=end
|
103
|
+
def mount_all_dvd
|
104
|
+
system("devcon.exe rescan >null 2>&1")
|
105
|
+
end
|
106
|
+
|
107
|
+
=begin
|
108
|
+
参数:盘符号例如D:
|
109
|
+
功能:打开光盘里的内容
|
110
|
+
返回值:默认
|
111
|
+
=end
|
112
|
+
def read_dvd(str)
|
113
|
+
#AutoItX3.run("explorer.exe #{str}")
|
114
|
+
system("dir #{str} >null 2>&1")
|
115
|
+
end
|
116
|
+
end
|
117
|
+
|
118
|
+
end #module vmopt
|
119
|
+
|
120
|
+
|
@@ -0,0 +1,104 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
require 'iconv' if RUBY_VERSION.to_f < 1.9
|
3
|
+
class String # :nodoc: all
|
4
|
+
#判断是否为utf8
|
5
|
+
def utf8?
|
6
|
+
if String.method_defined?(:encode)
|
7
|
+
return true if self.force_encoding("UTF-8").valid_encoding?
|
8
|
+
return false
|
9
|
+
else
|
10
|
+
unpack('U*') rescue return false
|
11
|
+
return true
|
12
|
+
end
|
13
|
+
end
|
14
|
+
|
15
|
+
#TODO:参数功能目前没有用
|
16
|
+
def to_utf8(enc='GBK')
|
17
|
+
if self.respond_to?(:encode)
|
18
|
+
return self if utf8?
|
19
|
+
self.encode('UTF-8',enc)
|
20
|
+
else
|
21
|
+
require 'iconv' if RUBY_VERSION.to_f < 1.9
|
22
|
+
return self if utf8?
|
23
|
+
begin
|
24
|
+
Iconv.iconv('UTF-8',enc,self).at(0).to_s
|
25
|
+
rescue
|
26
|
+
self
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
#TODO:参数功能目前没有用
|
32
|
+
def to_gbk(enc='UTF-8')
|
33
|
+
if self.respond_to?(:encode)
|
34
|
+
return self unless utf8?
|
35
|
+
self.encode('GBK', enc)
|
36
|
+
else
|
37
|
+
return self unless utf8?
|
38
|
+
require 'iconv' if RUBY_VERSION.to_f < 1.9
|
39
|
+
begin
|
40
|
+
Iconv.iconv('GBK',enc,self).at(0).to_s
|
41
|
+
rescue
|
42
|
+
self
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
def to_gb2312(enc = 'UTF-8')
|
48
|
+
# require 'iconv'
|
49
|
+
# Iconv.iconv('GB2312','UTF-8',self).at(0).to_s
|
50
|
+
if self.respond_to?(:encode)
|
51
|
+
self.encode('GB2312', enc)
|
52
|
+
else
|
53
|
+
begin
|
54
|
+
self.unpack("U*")
|
55
|
+
require 'iconv' if RUBY_VERSION.to_f < 1.9
|
56
|
+
Iconv.iconv('GB2312',enc,self).at(0).to_s
|
57
|
+
rescue ::ArgumentError
|
58
|
+
self
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
def to_arr()
|
63
|
+
self.split('&') #暂时未考虑&在\之后的问题,fix this bug
|
64
|
+
end
|
65
|
+
|
66
|
+
def __camelize(first_letter_in_uppercase=true)
|
67
|
+
if first_letter_in_uppercase
|
68
|
+
self.to_s.gsub(/\/(.?)/) { "::#{$1.upcase}" }.gsub(/(?:^|_)(.)/) { $1.upcase }
|
69
|
+
else
|
70
|
+
self.to_s[0].chr.downcase + camelize(self)[1..-1]
|
71
|
+
end
|
72
|
+
end
|
73
|
+
alias camelize __camelize
|
74
|
+
|
75
|
+
def __underscore
|
76
|
+
word = self.to_s.dup
|
77
|
+
word.gsub!(/::/, '/')
|
78
|
+
word.gsub!(/([A-Z]+)([A-Z][a-z])/,'\1_\2')
|
79
|
+
word.gsub!(/([a-z\d])([A-Z])/,'\1_\2')
|
80
|
+
word.tr!("-", "_")
|
81
|
+
word.downcase!
|
82
|
+
word
|
83
|
+
end
|
84
|
+
alias underscore __underscore
|
85
|
+
|
86
|
+
end
|
87
|
+
|
88
|
+
class << nil
|
89
|
+
def to_utf8
|
90
|
+
""
|
91
|
+
end
|
92
|
+
|
93
|
+
end
|
94
|
+
|
95
|
+
|
96
|
+
if $0 == __FILE__
|
97
|
+
# require 'string'
|
98
|
+
puts "中文123中文".to_gbk.dump
|
99
|
+
puts "中文123中文".to_gb2312.dump
|
100
|
+
puts File.join("中文abc/abc","中文").to_gbk.dump
|
101
|
+
puts File.join("中文abc/abc","中文").to_gb2312.dump
|
102
|
+
puts 'ab_c'.camelize
|
103
|
+
end
|
104
|
+
|
@@ -0,0 +1,128 @@
|
|
1
|
+
#encoding: utf-8
|
2
|
+
#$:.unshift File.join(__FILE__,"..","..")
|
3
|
+
require "vmopt/windows/win_net"
|
4
|
+
require "vmopt/ext/string_ext"
|
5
|
+
|
6
|
+
module Vmopt
|
7
|
+
class NetWork
|
8
|
+
|
9
|
+
#功能:显示可用网络接口
|
10
|
+
#返回:返回接口名称数组
|
11
|
+
def self.show_netinterface()
|
12
|
+
WinNet.interfaces
|
13
|
+
end
|
14
|
+
|
15
|
+
#功能:检查网络接口的连接状态
|
16
|
+
#返回:返回状态字串
|
17
|
+
def self.show_interface_stat(interface)
|
18
|
+
adapter(interface.to_utf8);
|
19
|
+
WinNet.netconnstatus[interface.to_utf8]
|
20
|
+
end
|
21
|
+
|
22
|
+
#功能:检查接口是否存在,返回接口名对应的适配器
|
23
|
+
def self.adapter(interface)
|
24
|
+
interface = interface.to_utf8
|
25
|
+
raise WinNetError::NoInterfaceError "Give me no NetWorkinterface" if interface.nil? or interface.empty?
|
26
|
+
adapter =WinNet.network_adapter.select do |inf|
|
27
|
+
inf.NetConnectionId == interface ;
|
28
|
+
end
|
29
|
+
raise WinNetError::NoInterfaceError "Find no interface #{interface}" if adapter.empty?
|
30
|
+
adapter[0]
|
31
|
+
end
|
32
|
+
|
33
|
+
#功能:执行devcon命令
|
34
|
+
def self.devcon_exec(cmd)
|
35
|
+
status = system("#{cmd} 1>&2");
|
36
|
+
status
|
37
|
+
end
|
38
|
+
|
39
|
+
#功能:给定一个网卡接口名,卸载网卡
|
40
|
+
#例子:adapter_opt("本地连接 2","禁用")
|
41
|
+
def self.adapter_opt(interface, opt)
|
42
|
+
pci = adapter(interface).PNPDeviceID;
|
43
|
+
optt=case opt.to_utf8
|
44
|
+
when "卸载" then "remove"
|
45
|
+
when "禁用" then "disable"
|
46
|
+
when "启用" then "enable"
|
47
|
+
else raise WinNetError::InvalidParamError "Unkown option for adapter.-#{opt}"
|
48
|
+
end
|
49
|
+
|
50
|
+
cmd = "devcon.exe /r #{optt} \"@#{pci}\" "
|
51
|
+
devcon_exec(cmd)
|
52
|
+
end
|
53
|
+
|
54
|
+
# #功能:安装一个网卡,暂时不做了,用户需要获取网卡的描述
|
55
|
+
# def self.adapter_install()
|
56
|
+
# devcon /r install C:\windows\system32\drivers\rtl8139.sys 硬件ID
|
57
|
+
# end
|
58
|
+
|
59
|
+
#功能:扫描硬件改动
|
60
|
+
#
|
61
|
+
def self.adapter_rescan()
|
62
|
+
cmd = "devcon.exe rescan"
|
63
|
+
devcon_exec(cmd)
|
64
|
+
end
|
65
|
+
|
66
|
+
#功能:返回网卡描述信息,用来判断网卡型号
|
67
|
+
def self.adapter_discript()
|
68
|
+
description=[]
|
69
|
+
WinNet.network_adapter_configurations.each do |interface|
|
70
|
+
description << interface.description
|
71
|
+
end
|
72
|
+
description
|
73
|
+
end
|
74
|
+
|
75
|
+
#功能:设置网卡的配置模式为dhcp
|
76
|
+
def self.adapter_set_dhcp(interface)
|
77
|
+
adapter(interface);
|
78
|
+
interface = "\""+interface.to_gbk+"\""
|
79
|
+
ipset_cmd = "netsh interface ip set address name=#{interface} source=dhcp".to_gbk
|
80
|
+
dnsset_cmd = "netsh interface ip set dns name=#{interface} source=dhcp".to_gbk
|
81
|
+
ipset_status = system("#{ipset_cmd} >null 2>&1");
|
82
|
+
dnsset_status = system("#{dnsset_cmd} >null 2>&1");
|
83
|
+
|
84
|
+
ipset_status & dnsset_status
|
85
|
+
|
86
|
+
end
|
87
|
+
|
88
|
+
#功能:设置网卡为配置的参数
|
89
|
+
def self.adapter_set_static(interface, opt={})
|
90
|
+
adapter(interface);
|
91
|
+
interface = "\""+interface.to_gbk+"\""
|
92
|
+
ipset_cmd = "netsh interface ip set address name=#{interface} source=static addr=#{opt[:addr]} mask=#{opt[:mask]}".to_gbk
|
93
|
+
gwset_cmd = "netsh interface ip set address name=#{interface} gateway=#{opt[:gateway]} gwmetric=0".to_gbk
|
94
|
+
dnsset_cmd = "netsh interface ip set dns name=#{interface} source=static addr=202.106.128.86 register=primary".to_gbk
|
95
|
+
dns2set_cmd = "netsh interface ip add dns name=#{interface} addr=8.8.8.8 index=2".to_gbk
|
96
|
+
|
97
|
+
ipset_status = system(ipset_cmd)
|
98
|
+
gwset_status = system(gwset_cmd)
|
99
|
+
dns_status = system(dnsset_cmd)
|
100
|
+
dns2_staus = system(dns2set_cmd)
|
101
|
+
|
102
|
+
ipset_status & dns_status & dns2_staus & gwset_status
|
103
|
+
|
104
|
+
end
|
105
|
+
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
if __FILE__ == $0
|
110
|
+
|
111
|
+
Vmopt::NetWork.show_netinterface.each { |e| puts (e) }
|
112
|
+
Vmopt::NetWork.show_netinterface.each do |inf|
|
113
|
+
puts "#{inf} :" + Vmopt::NetWork.show_interface_stat(inf)
|
114
|
+
end
|
115
|
+
Vmopt::NetWork.adapter_opt("本地连接 4", "禁用")
|
116
|
+
Vmopt::NetWork.adapter_opt("本地连接 4", "启用")
|
117
|
+
#Vmopt::NetWork.adapter_opt("本地连接 3", "卸载")
|
118
|
+
# Vmopt::NetWork.adapter_rescan
|
119
|
+
# sleep 10
|
120
|
+
Vmopt::NetWork.adapter_discript.each{|d| puts (d) }
|
121
|
+
|
122
|
+
Vmopt::NetWork.adapter_set_static("本地连接 4", {:addr => "192.168.12.10", :mask => "255.255.252.0", :gateway => "192.168.12.1"})
|
123
|
+
Vmopt::NetWork.adapter_set_dhcp("本地连接 4")
|
124
|
+
|
125
|
+
end
|
126
|
+
|
127
|
+
|
128
|
+
|
@@ -0,0 +1,145 @@
|
|
1
|
+
# encoding: utf-8
|
2
|
+
#$:.unshift File.join(__FILE__,"..","..")
|
3
|
+
require "vmopt/windows/win_winutils"
|
4
|
+
|
5
|
+
module Vmopt
|
6
|
+
|
7
|
+
class NotePad
|
8
|
+
|
9
|
+
# 功能:
|
10
|
+
# 1.初始化一个notepad程序,如果给定路径,则打开特定路径下的文件,同时激活该窗口
|
11
|
+
# 2.如果不给定路径,则打开notepad,同时激活该窗口。
|
12
|
+
# 参数:
|
13
|
+
# txt_path: 文件路径
|
14
|
+
# open_window: 表示需不需要创建该notepad窗口,默认创建,不设置表示获取该窗口
|
15
|
+
#
|
16
|
+
|
17
|
+
def initialize(opt)
|
18
|
+
|
19
|
+
if opt[:txt_path].nil?
|
20
|
+
@title = "记事本"
|
21
|
+
else
|
22
|
+
basename = File.basename(opt[:txt_path]).to_utf8
|
23
|
+
@title = "#{basename} - 记事本"
|
24
|
+
@path = opt[:txt_path]
|
25
|
+
end
|
26
|
+
|
27
|
+
if opt[:open_window]
|
28
|
+
winexe = Win32API.new('kernel32', 'WinExec', 'PI', 'I')
|
29
|
+
opt[:txt_path].nil? ? winexe.call("notepad.exe", 1) : winexe.call("notepad.exe #{opt[:txt_path]}", 1)
|
30
|
+
sleep 1
|
31
|
+
end
|
32
|
+
|
33
|
+
@window = WinUtils::find_window(/#{@title}/)
|
34
|
+
RAutomation::Window.wait_timeout=40
|
35
|
+
|
36
|
+
end
|
37
|
+
|
38
|
+
# 功能:
|
39
|
+
# 1.对一个激活的窗口设置文本内容
|
40
|
+
# 参数:
|
41
|
+
# msg:表示即将填充的信息
|
42
|
+
def set_text(msg)
|
43
|
+
@window.text_field(:class => "Edit", :id => 15).set(msg)
|
44
|
+
end
|
45
|
+
|
46
|
+
# 功能:读取一个已经打开的notepad的里面的内容
|
47
|
+
|
48
|
+
def read_text
|
49
|
+
@window.text_field(:class => "Edit", :id => 15).value
|
50
|
+
end
|
51
|
+
|
52
|
+
#功能:点击菜单中的保存按钮来保存文件
|
53
|
+
#参数:
|
54
|
+
# filepath:
|
55
|
+
# 如果指定了filepath 就表示要另外保存在filepath所在文件
|
56
|
+
# 如果没有指定filepath 而且 初始化时指定了path,那就只按保存键
|
57
|
+
# 如果初始化时没有指定path,要保存时又不提供路径,报异常
|
58
|
+
|
59
|
+
def save(filepath=nil)
|
60
|
+
if !filepath.nil?
|
61
|
+
@window.WinMenuSelectItem("[CLASS:Notepad]", "", "文件", "另存为")
|
62
|
+
|
63
|
+
savewindow = WinUtils::find_window(/另存为/)
|
64
|
+
savewindow.text_field(:class => "Edit").set(filepath)
|
65
|
+
#窗口关闭,遍历button会导致卡死,
|
66
|
+
# savewindow.buttons.each do|button|
|
67
|
+
# if button.value == "保存(&S)";
|
68
|
+
# button.click;
|
69
|
+
# end
|
70
|
+
# end
|
71
|
+
|
72
|
+
savewindow.send_keys("{ENTER}")
|
73
|
+
sleep 1
|
74
|
+
elsif !@path.nil? and filepath.nil?
|
75
|
+
@window.WinMenuSelectItem("[CLASS:Notepad]", "", "文件", "保存")
|
76
|
+
elsif @path.nil? and filepath.nil?
|
77
|
+
raise WinUtils::NoSavePathError,"Not found the save path ."
|
78
|
+
end
|
79
|
+
end #end of save
|
80
|
+
|
81
|
+
#功能:关闭记事本
|
82
|
+
def close
|
83
|
+
@window.WinClose("[CLASS:Notepad]", "")
|
84
|
+
end #end of close
|
85
|
+
|
86
|
+
end #end of class NotePad
|
87
|
+
|
88
|
+
end #end of module vmopt
|
89
|
+
|
90
|
+
if __FILE__ == $0
|
91
|
+
|
92
|
+
#File.delete("C:\\1.txt") if FileTest::exist?("C:\\1.txt")
|
93
|
+
notepad = Vmopt::NotePad.new({:open_window => true, :txt_path => "C:\\1.txt"})
|
94
|
+
#notepad.set_text("hello world")
|
95
|
+
puts notepad.read_text
|
96
|
+
#notepad.save("C:\\1.txt")
|
97
|
+
#notepad.close
|
98
|
+
|
99
|
+
end
|
100
|
+
|
101
|
+
|
102
|
+
#------使用 au3 的实现----先放着后续可能复用---
|
103
|
+
#
|
104
|
+
# module Vmopt
|
105
|
+
# class NotePad
|
106
|
+
# def initialize()
|
107
|
+
# AutoItX3.run("notepad.exe")
|
108
|
+
# AutoItX3::Window.wait("无标题 - 记事本")
|
109
|
+
# @window = AutoItX3::Window.new("无标题 - 记事本")
|
110
|
+
# end
|
111
|
+
|
112
|
+
# def close
|
113
|
+
# @window.close
|
114
|
+
# end
|
115
|
+
|
116
|
+
# def set_text(msg)
|
117
|
+
# @window.activate
|
118
|
+
# edit = @window.focused_control
|
119
|
+
# edit.text = msg
|
120
|
+
# end
|
121
|
+
|
122
|
+
# def read_text
|
123
|
+
# @window.activate
|
124
|
+
# edit = @window.focused_control
|
125
|
+
# edit.text
|
126
|
+
# end
|
127
|
+
|
128
|
+
# def save_to(filepath)
|
129
|
+
# @window.activate
|
130
|
+
# @window.select_menu_item("文件", "另存为")
|
131
|
+
# window_save = AutoItX3::Window.new("另存为")
|
132
|
+
# window_save.activate
|
133
|
+
# window_save.focused_control.text = filepath
|
134
|
+
# AutoItX3::send_keys("{enter}")
|
135
|
+
|
136
|
+
# end
|
137
|
+
|
138
|
+
# end
|
139
|
+
# end
|
140
|
+
|
141
|
+
# notepad = Vmopt::NotePad.new()
|
142
|
+
# notepad.set_text("adfhj")
|
143
|
+
# puts notepad.read_text
|
144
|
+
# notepad.save_to("C:\\1.txt")
|
145
|
+
# notepad.close
|