[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[问题求助] [已解决]VBS如何实现同一对话框显示几段代码的执行结果并可选择是否输出结果到文本

网上不同地方找的代码,希望实现如下功能,帮忙看怎么整合到一起输出,多谢!

1、由于不同代码不同功能,输出是好几个界面,现希望将这几个功能的输出内容界面合并输出到一个界面来显示
2、将最终合并输出的内容以文本方式写入当前目录下的output.txt,带(是/否 输出)选项
  1. k=1
  2. Set wmiService = GetObject("winmgmts:\\.\root\cimv2")
  3. Set wmiObjects = wmiService.ExecQuery("SELECT * FROM Win32_OperatingSystem")
  4. '第一部分:希望在一个界面输出显示的内容
  5. For Each wmiObject In wmiObjects
  6.     msgbox "系统"&k&vblf&"" _
  7. &vblf&"计算机名: 不知道在这里显示的代码" _
  8. &vblf&"WinProductID: 不知道在这里显示的代码" _
  9. &vblf&"" _
  10. &vblf&"系统版本: "&wmiObject.Caption _
  11. &vblf&"安装时间: "&wmiObject.InstallDate  _
  12. &vblf&"最后启动: "&wmiObject.lastbootuptime  _
  13. &vblf&"能不能让时间格式显示为:2016-05-05 21:08:55 ?" _
  14. &vblf&"" _
  15. &vblf&"ip地址: 不知道在这里显示的代码" _
  16. &vblf&"MAC地址: 不知道在这里显示的代码"
  17. next
  18. '第二部分:显示“计算机名”(如果 第一部分 可以实现显示的话,这里就不用了)
  19. Set colSettings = wmiService.ExecQuery _
  20.     ("Select * from Win32_ComputerSystem")
  21. For Each objComputer in colSettings
  22.     Wscript.Echo "System Name: " & objComputer.Name
  23. next
  24. '第三部分:显示“IP、MAC地址”(如果 第一部分 可以实现显示的话,这里就不用了)
  25. Function GetIPMAC(ComputerName)
  26. Dim objWMIService,colItems,objItem,objAddress
  27. Set objWMIService = GetObject("winmgmts://" & ComputerName & "/root/cimv2")
  28. Set colItems = objWMIService.ExecQuery("Select * From Win32_NetworkAdapterConfiguration Where IPEnabled = True")
  29. For Each objItem in colItems
  30. For Each objAddress in objItem.IPAddress
  31.   If objAddress <> "" then
  32.   GetIPMAC = "IP 地址:  " & objAddress  & vbNewLine &  "MAC地址:  " & objItem.MACAddress
  33.   Exit For
  34. End If  
  35. Next
  36. Exit For
  37. Next
  38. End Function
  39. WScript.Echo GetIPMAC(".")
  40. '第四部分:win10 序列号查看器(如果 第一部分 可以实现显示的话,这里就不用了)
  41. Set WshShell = CreateObject("WScript.Shell")
  42. regKey = "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\"
  43. DigitalProductId = WshShell.RegRead(regKey & "DigitalProductId")
  44. WinProductName = "Windows Product Name: " & WshShell.RegRead(regKey & "ProductName") & vbNewLine
  45. WinProductID = "Windows Product ID: " & WshShell.RegRead(regKey & "ProductID") & vbNewLine
  46. WinProductKey = ConvertToKey(DigitalProductId)
  47. strProductKey ="Windows Key: " & WinProductKey
  48. WinProductID = WinProductName & WinProductID & strProductKey
  49. MsgBox(WinProductID)
  50. Function ConvertToKey(regKey)
  51.     Const KeyOffset = 52
  52.     isWin8 = (regKey(66) \ 6) And 1
  53.     regKey(66) = (regKey(66) And &HF7) Or ((isWin8 And 2) * 4)
  54.     j = 24
  55.     Chars = "BCDFGHJKMPQRTVWXY2346789"
  56.     Do
  57.         Cur = 0
  58.         y = 14
  59.         Do
  60.             Cur = Cur * 256
  61.             Cur = regKey(y + KeyOffset) + Cur
  62.             regKey(y + KeyOffset) = (Cur \ 24)
  63.             Cur = Cur Mod 24
  64.             y = y -1
  65.         Loop While y >= 0
  66.         j = j -1
  67.         winKeyOutput = Mid(Chars, Cur + 1, 1) & winKeyOutput
  68.         Last = Cur
  69.     Loop While j >= 0
  70.     If (isWin8 = 1) Then
  71.         keypart1 = Mid(winKeyOutput, 2, Last)
  72.         insert = "N"
  73.         winKeyOutput = Replace(winKeyOutput, keypart1, keypart1 & insert, 2, 1, 0)
  74.         If Last = 0 Then winKeyOutput = insert & winKeyOutput
  75.     End If
  76.     a = Mid(winKeyOutput, 1, 5)
  77.     b = Mid(winKeyOutput, 6, 5)
  78.     c = Mid(winKeyOutput, 11, 5)
  79.     d = Mid(winKeyOutput, 16, 5)
  80.     e = Mid(winKeyOutput, 21, 5)
  81.     ConvertToKey = a & "-" & b & "-" & c & "-" & d & "-" & e
  82. End Function
复制代码
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

回复 23# pcl_test


    非常感谢版主的帮助!   全部完工~

TOP

本帖最后由 pcl_test 于 2016-7-25 00:19 编辑

回复 21# doswork
  1. Set fso = CreateObject("Scripting.FileSystemObject")
  2. Set shell = CreateObject("WScript.Shell")
  3. str="c: ntfs"&vbTab&"共:55 GB"&vbTab&"可用15 GB"&vbTab&"使用率 60%" _
  4.     & vbCrLf &"d: ntfs"&vbTab&"共:95.512 GB"&vbTab&"可用15.512 GB"&vbTab&"使用率 60%" _
  5.     & vbCrLf &"e: fat32"&vbTab&"共:95 GB"&vbTab&"可用1.5 GB"&vbTab&"使用率 2%"
  6. outfile="outfile.txt"
  7. msgbox(str)
  8. ShowInfo(replace("方法一,表格<br/>"&formatTable(str), VbCrLf, "<br/>"))
  9. ShowInfo(replace("方法二,按字段长度填充空格<br/>"&formatSpace(str), VbCrLf, "<br/>"))
  10. '自定义对话框
  11. Function ShowInfo(info)
  12.     CreateObject("WScript.Shell").Exec("mshta.exe ""about:<hta:application showintaskbar=no />" &_
  13.         "<title>提示</title><script>window.resizeTo(600, 600);" & _
  14.         "function writetxt(){var txt=document.getElementById('info').innerText.replace(/<br\/>/g, '\r\n');" & _
  15.         "(new ActiveXObject('Scripting.FileSystemObject')).OpenTextFile('"& outfile &"',2,true).write(txt);close();}</script>" & _
  16.         "<body style='font-family:SimSun;'><div style='position:fixed;top:0;left:0;'>是否保存以下信息到文本文件&nbsp;<font style='color:#FF0000;'>"& outfile &"</font>?" & _
  17.         "<input type='button' value='是(Y)' onclick='writetxt()'>&nbsp;&nbsp;&nbsp;&nbsp;" & _
  18.         "<input type='button' value='否(N)' onclick='window.close()'></div><br/><div id='info'><font style='color:#008200;'>"& info &"</font></div></body>""").StdOut.ReadAll
  19. End Function
  20. '套入表格
  21. Function formatTable(str)
  22.     tr=split(str, vbCrLf)
  23.     For i=0 to Ubound(tr)
  24.         s=s&"<tr>"
  25.         td = split(tr(i), vbTab)
  26.         For j=0 to Ubound(td)
  27.             s=s&"<td>"&td(j)&"</td>"
  28.         Next
  29.         s=s&"</tr>"
  30.     Next
  31.     formatTable="<table>"&s&"</table>"
  32. End Function
  33. '按字段长度填充空格
  34. Function formatSpace(str)
  35.     sp=Space(100)
  36.     Set objDict = WSH.CreateObject("Scripting.Dictionary")
  37.     tr=split(str, vbCrLf)
  38.     For i=0 to Ubound(tr)
  39.         td = split(tr(i), vbTab)
  40.         For j=0 to Ubound(td)
  41.             l=0
  42.             n=0
  43.             For k=1 to len(td(j))
  44.                 c=Asc(Mid(td(j), k, 1))
  45.                 If c>0 and c<127 Then
  46.                     l = l+1
  47.                 Else
  48.                     n = n+1
  49.                     l = l+2
  50.                 End If
  51.             Next
  52.             If n>0 Then objDict.Add "#"&i&j, n
  53.             If not objDict.Exists(j) Then
  54.                 objDict.Add j, l
  55.             Else
  56.                 If l > CInt(objDict.Item(j)) Then objDict.Item(j)=l
  57.             End If
  58.         Next
  59.     Next
  60.    
  61.     For i=0 to Ubound(tr)
  62.         td = split(tr(i), vbTab)
  63.         For j=0 to Ubound(td)-1
  64.             If objDict.Exists("#"&i&j) Then
  65.                 s=s&replace(left(td(j)&sp, objDict.Item(j)-objDict.Item("#"&i&j)+3), " ", "&nbsp;")
  66.             Else
  67.                 s=s&replace(left(td(j)&sp, objDict.Item(j)+3), " ", "&nbsp;")
  68.             End If
  69.         Next
  70.         s=s&td(Ubound(td))&vbCrLf
  71.     Next
  72.     formatSpace=s
  73. End Function
复制代码
1

评分人数

    • doswork: 感谢版主的帮助!技术 + 1

TOP

回复 19# pcl_test


    您好版主,能再帮最后一个忙吗?
vbs转换成hta后的 不对齐 问题,上一楼 详述,十分感谢!

TOP

本帖最后由 doswork 于 2016-7-9 18:26 编辑

回复 19# pcl_test


    不好意思,还得请教版主最后一个小问题: 这小段儿代码怎么让取得的硬盘大小数字对齐?(18楼有相对完整代码)

   代码生成后的结果有 30 G 的,也有 30.5 G 的(取的是保留小数点后1位,如果保留3位,分行显示就乱,多块儿硬盘的就更乱了),查资料在这里不知道怎么套用……
如果取小数点后三位,显示效果:
第一行:   c: ntfs  共:55 GB    可用15 GB    使用率 60%
第二行:   d: ntfs  共:95.512 GB    可用15.512 GB    使用率 60%
   
查论坛找到最简洁的一段儿代码,但在这里好像不适合套用……
(思路知道是需要添加tab或空格,固定值可以操作,但这里是变量值还带公式,就不知道怎么处理了……)
尝试过加 & vbTab ,但在输出的 hta 中没有作用,不能对齐,单独的 msgbox 有效。
http://www.bathome.net/redirect. ... d=1246&pid=5946
  1.                    For Each oLD In cLD
  2.                      Dx = Dx _
  3.                         & vbTab & oLD.DeviceID &" " & Left(oLD.VolumeName&"         " ,11) & Left(oLD.FileSystem&"   " ,6) & "共:" _
  4.                         & Right("    "&Round(oLD.Size/1073741824,1),6)                &" GB    可用:" _
  5.                         & Right("    "&Round(oLD.FreeSpace/1073741824,1),6)           &" GB    使用率:"_
  6. & CInt( (100*((oLD.Size-oLD.FreeSpace)/oLD.Size)) ) &"%"  & vbCrLf
  7. WriteTable "分区信息",dx  
  8.                    Next
复制代码

TOP

回复 19# pcl_test


    非常感谢版主指点!
    目前的问题全部解决完毕~

TOP

本帖最后由 pcl_test 于 2016-7-7 21:23 编辑

回复 18# doswork

最后一次
1、html中以&nbsp;代表空格
& vbCrLf &"版      本: "& version  _ ……
& vbCrLf &"版&nbsp;&nbsp;&nbsp;&nbsp;本: "& version  _ ……

2、出现内容叠加是因为你把上一次的结果也加进去了
Dx = Dx  & vbTab & oLD.DeviceID ……    Dx = oLD.DeviceID……
cx = cx & "【 硬盘 " & i &" 】  型号: "……    cx = "【 硬盘 " & i &" 】  型号: "……
  1. for i=1 to 10
  2.     a=i  '未叠加
  3.     b=b&i  '叠加
  4.     msgbox "a="&a&" b="&b
  5. next
复制代码
1

评分人数

    • doswork: 感谢版主的指点~技术 + 1

TOP

回复 10# pcl_test


    想完成自己做个“硬件简易检测”的这个想法,新手最近问的有点儿多,非常感谢版主耐心的帮助!

再问下关于VBS输出到 hta 或 html 里面“对齐”、“换行”的概念问题:

问题一:就是10楼这里,我添加内容之后,在代码里看是整齐的,通过之前 msgbox 方式输出也是整齐的,但 hta 的方式输出后无法对齐,自动“缩进”了

osinfo = "系统:"& caption _
    & vbCrLf &"版本:" & version _
    & vbCrLf &"安装时间:"& FormatDT(installdate) _
    & vbCrLf &"最后启动:"& FormatDT(lastbootuptime)      
    & vbCrLf &"版      本: "& version  _         '就这一行,有空格之后,增加中间的空格也没有用,输出的结果就只能是   “版 本: 10.0” ,好像结果只能保留一个空格,再加也没用!
    & vbCrLf &"版                本: "& version  _   '尝试这样不行, 输出结果还是    “版 本: 10.0”
    & vbCrLf &"版         "&"              本: "& version  _   '尝试这样不行, 输出结果还是    “版 本: 10.0”
    & vbCrLf &"产品  ID: "& productid _
    & vbCrLf &"产品密钥: "& productkey _


问题二:这是一个输出为 html 的代码,我加入原先在 msgbox 或 hta 方式显示正常的一段儿代码(识别硬盘及详细分区),在这里总调整不好,不能显示正常的效果

正常效果应该是:(一块儿、一块儿检测并分别显示)

硬盘 0 型号: xxxx  标称容量: xx GB 实际容量: xx GB
分区: C 总大小: xx GB 可用空间: xx GB 使用率: xx%
分区: D 总大小: xx GB 可用空间: xx GB 使用率: xx%

硬盘 1 型号: xxxx  标称容量: xx GB 实际容量: xx GB
分区: E 总大小: xx GB 可用空间: xx GB 使用率: xx%
分区: F 总大小: xx GB 可用空间: xx GB 使用率: xx%
……

但该代码加入到输出为 html 形式的代码里之后,两块以上的硬盘,显示效果就成了下面的:(不知道怎么调整了……)
刚发现在 hta 的多硬盘情况下输出也有问题,单块儿显示没问题,还是代码我没调整好,显示是硬盘和分区分别叠加显示,而不是上面希望的正常效果,帮忙调整下,多谢!(就是循环不知道怎么调整)

硬盘 0 型号: xxxx  标称容量: xx GB 实际容量: xx GB 硬盘 1 型号: xxxx  标称容量: xx GB 实际容量: xx GB (连在一起)
分区: C 总大小: xx GB 可用空间: xx GB 使用率: xx% 分区: D 总大小: xx GB 可用空间: xx GB 使用率: xx% 分区: E 总大小: xx GB 可用空间: xx GB 使用率: xx% 分区: F 总大小: xx GB 可用空间: xx GB 使用率: xx% (出好几行,多块儿硬盘时是叠加显示的……)

html输出套用的代码:

TOP

回复 16# pcl_test


    确实,漏了一大段儿代码……
    对代码还不熟悉,多谢提醒!

TOP

回复 15# doswork

ConvertToKey是个自定义函数,你不能把函数体给漏了,这种低级错误不该犯
Function ConvertToKey(regKey)
……
End Function
1

评分人数

TOP

本帖最后由 pcl_test 于 2016-7-7 13:11 编辑

回复 10# pcl_test


    好的,是10楼您最后给调整的hta版本,我加入后报错,之前msgbox版本里面没有报错

TOP

回复 13# doswork

指定回应某楼层的在相应楼层点回复,少引用

测试没有问题

TOP

本帖最后由 pcl_test 于 2016-7-7 11:49 编辑

回复 12# pcl_test

    多谢版主帮助,不过原来能用的一小段儿代码在这个新的版本里不能用了,提示:类型不匹配 ' ConvertToKey '

代码:
  1. '第四部分:查看系统ID、密钥
  2. Set WshShell = CreateObject("WScript.Shell")
  3. regKey = "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\"
  4. DigitalProductId = WshShell.RegRead(regKey & "DigitalProductId")
  5. WinProductName = WshShell.RegRead(regKey & "ProductName")
  6. productid = WshShell.RegRead(regKey & "ProductID")
  7. productkey = ConvertToKey(DigitalProductId)
复制代码

TOP

回复 11# doswork


10L已整合

TOP

多谢版主!

这个好多了,大小可以自定义,我再拼接原来的

另:能帮忙处理个识别内存的代码吗?多谢!内存处理完这个VBS就算完工了~
希望效果:内存共计: xx mb    内存1:XX mb   内存2:xx mb ……

我找的一个识别内存的,但调用不出来(代码单独可用,调用就无效)……
代码如下:
  1. Function MemoryWrite()  
  2.                 '函数,写入内存信息  
  3. mtotal        = 0  
  4. num         = 0  
  5. mill         = 0  
  6.         Set colMemory = objswbemservices.execquery("select * from win32_physicalmemory",,48)  
  7.         For Each objitem In colMemory  
  8.                 mill = objitem.capacity/1048576  
  9. '                WriteTable "单根内存容量",mill & "M"  
  10.                 mtotal = mtotal+mill  
  11.                 num = num + 1  
  12.         Next  
  13. '        WriteTable "总计内存",num & "条" & "一共" & mtotal & "M"  
  14. End Function
复制代码

TOP

返回列表