【技术交流】lua脚本控制单位转换GB MB KB
rainmeter吧
全部回复
仅看楼主
level 11
qaw652 楼主
function Initialize()
KB = 1024;
MB = KB*KB;
GB = KB*MB;
MeasureName = SELF:GetOption('MeasureName');
end
function Update()
Y(MeasureName);
return R;
end
function Y(X)
Measure = SKIN:GetMeasure(X);
Value = Measure:GetValue();
if (Value > GB)
then
R = string.format("%.1f",Value / GB) .. " G";
elseif (Value > MB)
then
R = string.format("%.1f",Value / MB) .. " M";
elseif (Value > KB)
then
R = string.format("%.1f",Value / KB) .. " K";
else
R = string.format("%.1f",Value) .. " ";
end
end
——我喂自己袋盐
>>Mozilla/5.0 (Windows NT 10.0; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0
2015年10月31日 16点10分 1
level 11
[哈哈][哈哈][哈哈][哈哈][哈哈][哈哈][哈哈][哈哈][哈哈][哈哈]我只是来水贴的
2015年10月31日 16点10分 3
level 5
不懂小白来幫頂[乖][乖][乖][乖][乖][乖]
2015年10月31日 17点10分 4
level 11
看不大懂 好腻害的样子
2015年10月31日 22点10分 5
吧务
level 13
顶起[真棒]
2015年11月01日 00点11分 6
level 12
不懂lua
2015年11月01日 01点11分 7
level 11
qaw652 楼主
lz根据这个样品讲讲这两天自己对lua的理解吧(lz的水平也很低,编程有关的知识就只在大学考2级计算机时学过一点基础的c++,不要嫌弃算是抛砖引玉吧)。
=========rainmeter皮肤============
[XXX]
Measure=Script
ScriptFile=XXX.lua
MeasureName=XXX
MeasureNum=XX
Substitute=".0":""
[XXX]
---Measure的名称。
Measure=Script
---设置Measure类型为lua脚本。
ScriptFile=XXX.lua
---设置需要调用的lua脚本。
MeasureName=XXX MeasureNum=XX ---自定义的变量,等号左边的名字和右边的值都是自定义的,lua脚本通过SELF:GetOption()可以获取这个变量的值,这样我们输入不同的值获得lua脚本不同的结果。比如lz上面的样品,lua脚本通过SELF:GetOption(MeasureNum)可以获取到ini皮肤文件中的MeasureNum的值,当MeasureNum=1时,lua脚本会通过if语句判断后输出磁盘读写速度,当MeasureNum=2时,lua脚本会通过if语句判断后输出读写统计。
Substitute=".0":""
---替换.0为无字符,很多Measure通用的设置如Substitute都可以生效。
在Meter里调用Script与其他的Measure一样。
——我喂自己袋盐
>>Mozilla/5.0 (Windows NT 10.0; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0
2015年11月01日 08点11分 9
level 11
qaw652 楼主
==========lua脚本==========
function XXX(X)
end
---function xxx() end这个是函数的头尾,function为头,xxx是函数名,x是函数的参数,不需要参数就不用填,end是结尾。
function Initialize()
end
---Initialize是rainmeter定义的特殊函数名,这个函数只会在你手动刷新皮肤时会被执行一次,所以一般会放一些全局变量的初值(变量必须先被赋值才能拿来运算)。
function Update()
end
---Update同样是特殊函数名,这个函数在皮肤每次自动刷新时都会被执行,一般脚本的主体就放在这里了,这样就会实时输出结果,你可以将脚本的全部功能都放进这里,也可以编写多个自定义函数,然后在这里调用自定义函数。
——我喂自己袋盐
>>Mozilla/5.0 (Windows NT 10.0; WOW64; rv:41.0) Gecko/20100101 Firefox/41.0
2015年11月01日 08点11分 10
level 11
qaw652 楼主
=======如何将皮肤文件中的一些值引入lua中=========
XXX = SKIN:GetMeasure(XX);
---可以获取名字为XX的Measure的useid,并将useid放到XXX中。这个操作可以获取任意类型的Measure的useid,获取到id后就可以用这个id对对应的Measure进行各种操作。useid是一堆数字编号,每个Measure和Meter都有唯一的useid,具体是多少无关紧要。
XXX = XX:GetValue();
---可以用来获取useid为XX的Measure的数值,并将其数值放入XXX中。
XXX = SKIN:GetMeasure(XX);与XXX = XX:GetValue();结合运用,我们就能获取到需要进行处理的数值,例如样本中的磁盘读写速度:
[DiskIO_Write]
Measure=Plugin
Plugin=Plugins\PerfMon.dll
PerfMonObject=PhysicalDisk
PerfMonCounter="Disk Write Bytes/sec"
PerfMonInstance=_Total
上面的是磁盘写入速度检测的Measure。那么这样写就能让lua获取到磁盘写入速度:
A = SKIN:GetMeasure(DiskIO_Write);
B = A:GetValue();
这样B变量就是磁盘的写入速度了。
======如何让lua脚本的结果返回======
在主函数中,也就是function Update()中写入return,就能返回一个结果,这个结果会成为Measure的值。
=======如何设定不同的参数获得不同的lua输出结果==========
XXX = SELF:GetOption('XX');
---可以用来获取对应的Script中自定义的变量值,XXX为函数中的自定义的变量名,XX为Script中的自定义的变量名。这个只能用在类型为Script的Measure上。通过给定几个不同的参数,你可以让一个lua脚本输出不同的结果,例如样本中的磁盘读写速度:
[DiskIO_Read]
Measure=Plugin
Plugin=Plugins\PerfMon.dll
PerfMonObject=PhysicalDisk
PerfMonCounter="Disk Read Bytes/sec"
PerfMonInstance=_Total
[DiskIO_Read_TR]
Measure=Script
ScriptFile=TR.lua
MeasureName=DiskIO_Read
MeasureNum=1
Substitute=".0":""
[DiskIO_Write_TR2]
Measure=Script
ScriptFile=TR.lua
MeasureName=DiskIO_Write
MeasureNum=2
Substitute=".0":""
第2个和第3个是类型为Script的Measure,自定义变量名为MeasureName和MeasureNum,MeasureName的值不需要加'',之前没搞懂不好意思。第2个MeasureName的值为DiskIO_Read,MeasureNum的值为1,第3个MeasureName的值为DiskIO_Write,MeasureNum的值为2,那么在lua中这样写就能得到对应的参数:
A = SELF:GetOption('MeasureName');
B = SELF:GetOption('MeasureNum');
从第2个Measure那里得到的A值是DiskIO_Read,B值是1,从第3个Measure那里得到的A值是DiskIO_Write,B值是2(需要提到一点的是不同的类型为script的Measure可以调用同一个的lua脚本,不知道一个Measure能不能调用多个lua脚本,应该不能直接调用多个,可能可以调用一个脚本,再用这个脚本调用其他的脚本)。A值就是上面第1个Measure的名字,可以用XXX = SKIN:GetMeasure(XX);获取到useid,B值则可以加上if语句判断1与2,1的话返回速度,2的话返回统计。
2015年11月01日 08点11分 11
level 11
qaw652 楼主
=======if语句简单结构===========
if (条件)
then
语句
else
语句
end
如果条件成立(为真),那么执行then后面的语句,然后结束if,如果不成立(为假),那么执行else后面的语句,然后结束if。
条件一般是关系运算,如A == B表示A等于B,如果A等于B成立,那么执行then后面的语句。
=======ifelse语句==========
if (条件)
then
语句
elseif (条件)
then
语句
elseif (条件)
then
语句
else
语句
end
如果条件成立(为真),那么执行then后面的语句,然后结束if,如果不成立(为假),那么判断elseif的条件,如果条件成立(为真),那么执行then后面的语句,然后结束if,如果不成立(为假),那么判断elseif的条件,如果条件成立(为真),那么执行then后面的语句,然后结束if,......,如果不成立(为假),那么执行else后面的语句,然后结束if。
=======普通语句============
变量、赋值、计算、返回值(lua语句结束好像可以不用加; 是通过换行判断不同的语句的么?)
1.变量:A,B,...
变量的类型常用的主要有数值和字符串,数值可以进行算术运算,字符串不可以进行算术运算。local A表示A是局部变量,只在当前函数内使用。
2.赋值: A = B;
将B的值传递给A,在赋值前要确认B是有值的。
3.计算:A = B + C * D;
lua里好像是没有括号优先级的,运算符号的优先级是默认的,优先度由高到低:
^
not - (unary)
* /
+ -
..
< > <= >= ~= ==
and
or
在lua中运算符分为
算术运算 +加法 -减法 *乘法 /除法 ^幂次 %取余 -负号
关系运算 ==等于 ~=不等于 >大于 <小于 >=大于等于 <=小于等于
逻辑运算 and两个都为真结果才是真 or两个有一个为真结果就是真 not结果相反
其他运算 ..将两个字符串连接起来 #返回字符串或表的长度
4.返回值
return A;
return 123456;
return 'A';
如果A是定义过的变量,那么第1个会返回A的值,第2个会返回123456,第3个会返回A。
=========函数==========
function A(B)
C = B + 1
return C
end
A是函数名称,B是函数参数,C = B + 1 return C是主体。
当一个自定义函数写好后,需要在主函数里调用,调用时可以附加参数给自定义函数。主函数一般没有参数,因为其他函数不会调用主函数。在rainmeter的lua脚本里主函数就是function Update(),皮肤自动刷新数据时都会执行一次function Update()。function Initialize()只有在手动刷新时才会被执行一次,一般会放一些需要初始化赋予初值的变量。
在主函数里通过自定义函数名来调用函数,如
function Update()
X = 0
Y = A(X)
return Y
end
在这里我们调用了A函数,并把X作为A的参数,那么A函数里的C = X +1 ,就变成C = 0 + 1,A函数里下一句是return C,那么主函数里Y = C,也就是Y = 1,主函数里的return会返回皮肤文件,作为对应的Script的结果,这时Meter调用Script的数值就是1。
2015年11月01日 08点11分 12
吧务
level 11
只用rainmeter代码实现各种功能的渣渣路过帮顶。
2015年11月01日 23点11分 13
level 11
不懂帮顶[乖]
2015年11月02日 00点11分 14
吧务
level 13
不懂lua帮顶。。
2015年11月02日 04点11分 15
level 11
qaw652 楼主
皮肤手动刷新会自动清除统计,这样很不方便,修改成添加一个菜单项,点击后才清除统计(统计不会清除最大速度)。顺便再添加一个菜单项,点击后可以往雨滴的日志里输出统计情况。
主要是用了!CommandMeasure给lua发送指令,给定指令可以简单点,直接在lua里定义一个函数,需要的运算全放在这个函数里,然后指令直接调用这个函数就可以了。
我之前的脚本里对txt文件的处理不太好,打开txt完成读取或写入后,应该立刻关闭txt。
之前没有去关闭,导致手动刷新后txt内容丢失,没有真正保存。
Contexttitle可以为rainmeter皮肤右键添加一个自定义菜单项,需要放在[Rainmeter]下才能生效。Contextaction可以用!bang命令。
[Rainmeter]
Contexttitle=重置统计数据
Contextaction=[!DisableMeasureGroup TR][!CommandMeasure "DiskIO_OP" "OP()"][!Refresh]
Contexttitle2=输出统计到日志
Contextaction2=[!CommandMeasure "DiskIO_OP" "WR()"][!Refresh]
======txt逐行读取并获得数字======
function Text1()
A = '';
B = '';
C = '';
D = {};
A = io.open(txt ,"r");--以只读方式打开名字为txt的文件,将文件ID放入A中
for B in A:lines() do --重复执行,将A指向的文件的一行放入B中
for C in string.gmatch(B ,"%d+") do --重复执行,将B中找到的数字放入C中
if (C == nil)
then
break --如果有一行没有数字就跳过这行,break会跳出当前的for循环,在这里只跳出第二个for
end --结束if
table.insert(D ,C); --将每一个C放入数组D中
end --第二个for的结尾,在string.gmatch(B ,"%d+")为空值前重复执行for到end的代码
end --第一个for的结尾,在A:lines()为空值前重复执行for到end的代码
A:close(); --关闭打开的txt文件
end --结束函数
上面代码可以逐行读取txt文件,把数字提取出来放到D数组内。
使用时用D[1]代表读到的第一个数字,D[2]第二个...D[3]第三个...
=======读行=========
A:read("*l")表示读取一行,读取行是自动连续的,第一次读取行时读第一行,第二次时第二行.....
B = A:read("*l")表示读取一行并把数据放入B中
上面两步放在一起使用的话就表示跳过第一行,把第二行内容放入B中。
读取的内容无论是数字还是文本,默认类型就是字符串,要将读取的内容进行算术运算的话,要用tonumber()转换类型到数字。例如:
B = A:read("*l")
C = tonumber(B) +1
在用tonumber前要确认B这个字符串的内容是正确的数字。
=========string.sub========
A = 'hello world'
B = string.sub(A ,4 ,8)
那么B = 'lo wo'
string.sub(X,Y,Z)
string.sub可以从一个字符串中截取指定位置的字符串
X代表要进行截取的字符串,Y代表截取开始位置,Z代表截取结束位置
2015年11月05日 04点11分 16
样品http://pan.baidu[太开心].com/s/1fYUC2
2015年11月05日 04点11分
level 11
qaw652 楼主
加入时间记录,之前的样品好像没打包好。
2015年11月23日 02点11分 17
http://pan.baidu[汗].com/s/1jGjhMOu
2015年11月23日 02点11分
之前的貌似在拔插U盘时会出现奇怪的大数据,现在加了个数据过大不理的判断
2017年04月25日 11点04分
附上http[怒]://pan.baidu[狂汗].com/s/1eRXwoNK
2017年04月25日 11点04分
http[怒]://pan.baidu[委屈].com/s/1kUU8MOn
2017年07月21日 12点07分
1 2 尾页