dos时代菜鸟 发表于 2018-4-21 11:03:44

又一个 挂载 vhd 并分配指定盘符的 vbs

本帖最后由 dos时代菜鸟 于 2018-4-21 21:03 编辑

利用 run 方式 二次调用 脚本自身,实现 exec 模式的隐藏运行。即使 首次调用 是 cscript 方式 ,也一样隐藏,支持 附带参数 ,支持在 带空格 的目录运行。
利用 exec.stdout 获取 命令输出信息,分析出 分区编号,逐个 分配 盘符,不必生成diskpart 用脚本。

使用格式vhd.vbs “要挂载的vhd 文件完整路径”要分配的第一个盘符

如果 c:\temp.vhd 中有多3 分区,
vhd.vbs "c:\temp.vhd" r
就会挂载 temp.vhd 并将其中的三个分区 分配给 r ,s ,t三个盘符。

不输入 盘符,将 随系统分配盘符。



' 挂载 vhd,并分配盘符,
' 使用语法 :vhd.vbs <drv>
' 调用 diskpart 并隐藏运行,不必生成 diskpart 脚本,通过 exec.stdout 方式获取 命令结果,进行分析,明确 分区编号,为其分配盘符。
On error resume next

'----------------隐藏运行代码-----------------------
set ws=createObject("wscript.shell")
hide= """" & WScript.scriptFullName& """"
if WScript.Arguments.count=0then
    ws.run "cscript.exe " & hide &"-hide " ,0,false
    WScript.quit
elseif WScript.Arguments(WScript.Arguments.count-1)<>"-hide" then
args=" "
for each arg in WScript.Arguments
    args=args&""& """" & arg & """"
next
    ws.run "cscript.exe " & hide &args &"-hide " ,0,false
    WScript.quit
end if
'-----------------隐藏代码结束----------------------

l_n=0
if WScript.Arguments.Count>2 then l_n=asc(WScript.Arguments(1))-1 '设置盘符asc码

vhd=WScript.Arguments(0)
Set diskpart = ws.Exec("diskpart.exe")
with diskpart
.stdin.WriteLine "select vdisk file="&chr(34)&vhd&chr(34)
.stdin.WriteLine "attach vdisk"
.stdin.WriteLine "list partition"
lx=list1(3 , 3 ) '获取 list parttition 命令结果 给变量 lx
wscript.echo lx
.stdin.WriteLine "exit"
do until .status=1
wscript.sleep 100
loop
end with

Set diskpart = ws.Exec("diskpart.exe")
with diskpart
.stdin.WriteLine "select vdisk file="&chr(34)&vhd&chr(34)
wscript.echo list1(1,1)
l=""
s=0
pn=0
for n=1 to len(lx) '分析lx 获取 分区,并为其分配盘符
if mid(lx,n,1)=chr(10) then
      if left(l,1)="-" then s=1 '下一行包含 分区编号
      if s=1 and left(l,1)<>"-" then'本行 包含 分区编号
      pn=pn+1'分区 计数
      parts=split(l) '将本行信息 存入数组
      ps=0
      for each p in parts
          if p<>"" then
            ps=ps+1
            if ps=2 then '本数组单元 就是 分区编号
            .stdin.WriteLine "select partition="&p
            .stdin.WriteLine "assign "
            if l_n<>0 then '命令中附带 分区盘符参数
                .stdin.WriteLine "assign letter="&Ucase(chr(l_n+pn))
                wscript.echo list1(1,3)
            end if
            end if
          end if
      next
      end if
      l=""
else
    l=l&mid(lx,n,1)
end if
next
.stdin.Writeline "exit"
end with


'返回 diskpart.stdout 字符指针 当前位置 开始 第m 条命令到 第n 条命令的输出结果
function list1(m,n)
list1=""
    with diskpart
   .stdin.WriteLine "rem "
      i=0
      Do
            strFromProc=replace(replace(trim(.StdOut.ReadLine()),chr(10),""),chr(13),"")&chr(10)
            if instr(1,strFromProc,">")>0 then
          i=i+1
            elseif i>(m-1) and strfromproc<>"" then
            list1=list1&strfromproc
      end if
      Loop While i<(n+1)
    end with
end function



chishingchan 发表于 2018-4-21 14:50:55

DOS时代升级到VBS

dos时代菜鸟 发表于 2018-4-21 16:43:59

改进了一下,{:1_186:}

freesoft00 发表于 2018-4-21 17:00:13

个人更喜欢纯dos的,因为自己不懂vbs。

dos时代菜鸟 发表于 2018-4-21 21:01:47

本帖最后由 dos时代菜鸟 于 2018-4-21 21:04 编辑

freesoft00 发表于 2018-4-21 17:00
个人更喜欢纯dos的,因为自己不懂vbs。

cmd 应用范围更广泛,至少pe 都能用,而有的 pe 没有vbs 环境。

刚发现 win7 下 ,vbs以 exec 方式 调用 diskpart 给vhd 分配盘符,需要运行两次 diskpart ,第一次 挂在vhd ,第二次 分配盘符,如果一次性 挂载 就分配盘符,明明选择了 part, 在分配盘符的时候还会 说 没有选择卷。 win10没有这问题。 所以 更新下脚本 。这个 可能会牵引出 win7 的位置 溢出漏洞,可惜我没这本是。

zhjsn 发表于 2018-4-21 21:51:07

good

Dream漂移 发表于 2018-11-6 22:01:50


谢谢楼主分享技术资料!!很感兴趣!!

eastmz 发表于 2018-11-11 04:22:03

感谢楼主分享的学习资料

dsqlwz5966 发表于 2019-3-17 19:16:31

LZ辛苦了,刚好需要这个。

2011wind5win 发表于 2020-5-1 19:07:27

这个问题太难了,附件没分下载,能否公布出来学习一下,谢谢

2011wind5win 发表于 2020-5-1 19:43:47

vhd.vbs "c:\temp.vhd" r    加在哪里呢,请教下

2011wind5win 发表于 2020-5-1 20:38:18

请问 win10桌面系统运行 如何指定盘符呢?

dos时代菜鸟 发表于 2020-5-7 15:28:42

2011wind5win 发表于 2020-5-1 20:38
请问 win10桌面系统运行 如何指定盘符呢?

如果习惯鼠标操作,就用这个吧。

http://bbs.wuyou.net/forum.php?mod=viewthread&tid=413760&fromuid=1198

2011wind5win 发表于 2020-5-25 02:15:23

dos时代菜鸟 发表于 2020-5-7 15:28
如果习惯鼠标操作,就用这个吧。

http://bbs.wuyou.net/forum.php?mod=viewthread&tid=413760&fromuid ...

谢谢,抽空了试试
页: [1]
查看完整版本: 又一个 挂载 vhd 并分配指定盘符的 vbs