无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站广告联系 微信:wuyouceo QQ:184822951
查看: 4591|回复: 6
打印 上一主题 下一主题

vbs 调用 diskpart 交互式 装卸 硬盘分区盘符

[复制链接]
跳转到指定楼层
1#
发表于 2018-4-22 22:56:12 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 dos时代菜鸟 于 2018-4-28 15:36 编辑


仅 在 win10  x64 环境测试通过,其他环境 暂时 未测试。脚本已经尽量避免涉及对中文信息的提取,估计 英文下也能用。

比 cmd 优势在于不必频繁 调用 Diskpart.exe 节省调取时间。
因为是 内存 运行,不需要生成临时文件,diskpart 也是已经运行了的,所以 ,可以对 脚本所在分区进行 卸载。

算是 给 dos 板块 赚点儿人气儿吧。呵呵。

l-d-1.4.vbs.zip (1.98 KB, 下载次数: 50)

  1. On error resume next

  2. hide_cmd '调用隐藏运行代码

  3. set ws=createObject("wscript.shell")
  4. Set diskpart = ws.Exec("diskpart.exe")

  5. DIM DISK
  6. vol_line2=fresh()
  7. wscript.echo vol_line2
  8. volx2=volx()

  9. with diskpart
  10.   x=""
  11.   do until x=false
  12.     x=inputbox("盘 卷   盘符   大小  格式   卷标"&chr(10)&_
  13.                 "------------------------------------"&chr(10)&_
  14.                 vol_line2&chr(10)&_
  15.                 "请输入一个卷对应的序号:("&word(vol_line2,2)&"...)","选择装/卸一个卷")
  16.     ln=0
  17.     find=0
  18.     for each v in split(word(vol_line2,2),",")
  19.       ln=ln+1
  20.       if v<>""  and v=x then
  21.       find=1
  22.         if vol_d(vol_line2,ln)=" " then
  23.             wscript.echo "需要挂载"
  24.             wscript.echo volx2
  25.                 y=""
  26.                 y=inputbox("盘 卷   盘符   大小  格式   卷标"&chr(10)&_
  27.                 "------------------------------------"&chr(10)&_
  28.                 vol_line2&chr(10)&_
  29.                 "请输入一个盘符:"&chr(10)&_
  30.                 "卷: "&v&" --> "&volx2,"输入一个盘符")
  31.                 find2=0
  32.                 for each v2 in split(volx2,",")
  33.                   if v2<>"" and v2=Ucase(y) then
  34.                       .StdIn.WriteLine "select vol "&v
  35.                       .StdIn.WriteLine "Assign Letter="&v2
  36.                       wscript.echo list1(1,2)
  37.                       find2=1
  38.                       exit for
  39.                   end if
  40.                 next
  41.                 if find2=0 then msgbox "输入错误!"
  42.         else
  43.             wscript.echo "需要卸载"
  44.             .StdIn.WriteLine "select vol "&v
  45.             .StdIn.WriteLine "remove "
  46.             wscript.echo list1(1,2)
  47.         end if
  48.         vol_line2=fresh()
  49.         volx2=volx()
  50.         exit for
  51.       end if
  52.     next
  53.     if x<>"" and find=0 then msgbox "输入错误!"
  54.   loop
  55.   .StdIn.WriteLine "exit"
  56.   Do Until .Status=1
  57.     wscript.sleep 100
  58.   Loop
  59. End with

  60. '-------------获取卷序列列表
  61. function fresh()
  62. with diskpart  
  63.   .StdIn.WriteLine "list disk"
  64.   fresh=""
  65.   for each d in split(word(line0(list1(1,1)) , 2 ),",")
  66.     if d<>""  then
  67.       .StdIn.WriteLine "select disk "&d
  68.       .StdIn.WriteLine "detail disk"
  69.       DISK=D
  70.       fresh=fresh&vline(wordl(line0(list1(2,1)),2))
  71.     end if
  72.   next
  73. end with
  74. End function

  75. '-------------获取未使用的盘符列表
  76. function volx()
  77. with diskpart  
  78.   volx="C,D,E,F,G,H,I,J,K,L,N,M,O,P,Q,R,S,T,U,V,W,X,Y,Z"
  79.   .StdIn.WriteLine "list vol"
  80.   for each d in split(word0(wordl(line0(list1(1,1)),2) , 7,1 ),",")
  81.     if d<>" " and d<>"" then
  82.       volx=replace(volx,d&",","")
  83.     end if
  84.   next
  85. end with
  86. End function


  87. '----------找出所选卷的盘符
  88. Function vol_d(lx,lv)
  89. vol_d=""
  90. l=""
  91. ln2=0
  92. for n=1 to len(lx)
  93.   if mid(lx,n,1)=chr(10) and l<>chr(10) then
  94.       ln2=ln2+1
  95.       if ln2=lv then  vol_d=mid(l,11,1)
  96.       l=""
  97.   else
  98.     l=l&mid(lx,n,1)
  99.   end if
  100. next
  101. End function

  102. '----------根据 卷列表信息流 整理出 整理出 带有磁盘编号的 卷信息流-----------
  103. Function vline(lx)
  104. vline=""
  105. l=""
  106. for n=1 to len(lx)
  107.   if mid(lx,n,1)=chr(10) and l<>chr(10) then
  108.       vline=vline&" "&DISK&"  "&mid(l,1,7)&mid(l,41,9)&" "&mid(l,24,7)&mid(l,11,13)&chr(10)
  109.       l=""
  110.   else
  111.     l=l&mid(lx,n,1)
  112.   end if
  113. next
  114. End function

  115. '------------获取某个字符流中各行的某个范围(r~s)的字符串
  116. Function word0( lx , r ,s)
  117. word0=""
  118. l=""
  119. for n=1 to len(lx)
  120.   if mid(lx,n,1)=chr(10) and l<>chr(10) then
  121.       word0=word0&mid(l,r,s)&","
  122.       l=""
  123.   else
  124.     l=l&mid(lx,n,1)
  125.   end if
  126. next
  127. End function

  128. '-------------获取文本流中 各行第r个单词及其后内容---
  129. Function wordl(lx,r)
  130. wordl=""
  131. l=""
  132. for n=1 to len(lx)
  133.   if mid(lx,n,1)=chr(10) and l<>chr(10) then
  134.        i=0
  135.        s=0
  136.       for x=1 to len(l)
  137.         if mid(l,x,1)<>" " then
  138.           if s=0 then i=i+1
  139.           s=1
  140.           if i=r then
  141.             wordl=wordl&mid(l,x)&chr(10)
  142.             exit for
  143.           end if
  144.         else
  145.           s=0  
  146.         end if
  147.       next
  148.       l=""
  149.   else
  150.     l=l&mid(lx,n,1)
  151.   end if
  152. next
  153. End function

  154. '------------获取某个字符流中各行的某个单词,组合成一个由","隔断的字符串
  155. Function word( lx , r)
  156. word=""
  157. l=""
  158. for n=1 to len(lx)
  159.   if mid(lx,n,1)=chr(10) and l<>chr(10) then
  160.         parts=split(l)
  161.         ps=0
  162.         for each p in parts
  163.           if p<>"" then
  164.             ps=ps+1
  165.             if ps=r then  word=word&p&","
  166.           end if
  167.         next
  168.       l=""
  169.   else
  170.     l=l&mid(lx,n,1)
  171.   end if
  172. next
  173. End function

  174. '------------获取某个字符流中有价值的各行---标记字符"-"-----------
  175. Function line0(lx)
  176. line0=""
  177. l=""
  178. s=0
  179. for n=1 to len(lx)
  180.   if mid(lx,n,1)=chr(10) and l<>chr(10) then
  181.       if left(l,1)="-" then s=1
  182.       if s=1 and left(l,1)<>"-" then  
  183.         if left(l,1)="*" then l=mid(l,3)
  184.         line0=line0&l&chr(10)
  185.       end if
  186.       l=""
  187.   else
  188.     l=l&mid(lx,n,1)
  189.   end if
  190. next
  191. End function

  192. '返回 diskpart.stdout 字符指针位置开始计算,第m条命令及其后面的n条命令的输出结果
  193. function list1(m,n)
  194. list1=""
  195.         with diskpart
  196.          .stdin.WriteLine "rem "
  197.                 i=0
  198.                 Do While i<(m+n)
  199.                     strFromProc=replace(replace(trim(.StdOut.ReadLine()),chr(10),""),chr(13),"")&chr(10)
  200.                     if instr(1,strFromProc,">")>0 then
  201.           i=i+1
  202.                     elseif i>(m-1) and strfromproc<>chr(10)  then
  203.                       list1=list1&strfromproc
  204.         end if
  205.                 Loop
  206.         end with
  207. end function

  208. '----------------隐藏运行代码-----------------------
  209. Sub hide_cmd()
  210.   set ws=createObject("wscript.shell")
  211.   hide= """" & WScript.scriptFullName  & """"
  212.   if WScript.Arguments.count=0  then
  213.     ws.run "cscript.exe " & hide &"  -hide " ,0,false
  214.     WScript.quit
  215.   elseif WScript.Arguments(WScript.Arguments.count-1)<>"-hide" then
  216.     args=" "
  217.     for each arg in WScript.Arguments
  218.       args=args&"  "& """" & arg & """"
  219.     next
  220.     ws.run "cscript.exe " & hide &args &"  -hide " ,0,false
  221.     WScript.quit
  222.   end if
  223. end Sub
  224. '-----------------隐藏代码结束----------------------
复制代码

评分

参与人数 2无忧币 +10 收起 理由
yu_xinxing + 5 赞一个!
freesoft00 + 5

查看全部评分

2#
 楼主| 发表于 2018-4-22 22:57:36 | 只看该作者
本帖最后由 dos时代菜鸟 于 2018-4-23 10:34 编辑



脚本 利用 exec 的 stdout 获取 diskpart 命令运行结果 ,分析 硬盘分区序列,由用户 选择 分区卷 序号,完成操作。
如果 选择的卷 有 盘符,就卸载,如果没有盘符,就询问 分配一个盘符。

脚本运行中间 不生成任何 中间文件,就一个 vbs 脚本 。

比 cmd 优势在于不必频繁 调用 Diskpart.exe 节省调取时间。

需要 系统 vbs 支持,有 diskpart.exe

可能 用  vbs 调用系统  dll 实现这个 功能 更便捷,这里只是 一个 实验 样本而已,就是 想 看看  exec 的 stdout 获取 程序输出 结果方面 的 功能 和应用。


回复

使用道具 举报

3#
发表于 2018-4-23 08:41:13 | 只看该作者
嘻嘻......

大师又放毒了......

每次看见大师的毒.......

俺的心里就特别的高兴......



回复

使用道具 举报

4#
发表于 2018-4-23 08:56:14 | 只看该作者
批处理呀,VBS之类的都不太行了,以后估计都得玩POWERSHELL了吧

点评

powershell 对环境要求可能更加苛刻, pe下,还是 cmd 最稳妥。  详情 回复 发表于 2018-4-23 09:27
回复

使用道具 举报

5#
 楼主| 发表于 2018-4-23 09:27:04 | 只看该作者
a22124497 发表于 2018-4-23 08:56
批处理呀,VBS之类的都不太行了,以后估计都得玩POWERSHELL了吧

powershell 对环境要求可能更加苛刻,
pe下,还是 cmd 最稳妥。
回复

使用道具 举报

6#
 楼主| 发表于 2018-4-23 09:57:40 | 只看该作者
本帖最后由 dos时代菜鸟 于 2018-4-23 10:38 编辑

加了个 获取 文本流 各行 第n个单词及其后面内容的函数。这个 在 cmd 下,一个 for 就搞定了。vbs 下 对文本流的操作,具体功能 都需要 自己编,正好 复习一下 vbs 下的文本字符串操作。呵呵。

用 vbs 的 Exec 方式 ,还有一个好处就是 可以一次调用 Disk part 完成所有操纵,不用像 cmd 中那样 频繁 调用 diskpart.exe 。
回复

使用道具 举报

7#
发表于 2018-5-13 15:51:13 | 只看该作者
特别喜欢这种代码式的教学帖,比起纯软件的帖子更容易学习到东西
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-4-24 11:26

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表