又一个 挂载 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
DOS时代升级到VBS 改进了一下,{:1_186:} 个人更喜欢纯dos的,因为自己不懂vbs。 本帖最后由 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 的位置 溢出漏洞,可惜我没这本是。
good
谢谢楼主分享技术资料!!很感兴趣!! 感谢楼主分享的学习资料 LZ辛苦了,刚好需要这个。 这个问题太难了,附件没分下载,能否公布出来学习一下,谢谢 vhd.vbs "c:\temp.vhd" r 加在哪里呢,请教下 请问 win10桌面系统运行 如何指定盘符呢? 2011wind5win 发表于 2020-5-1 20:38
请问 win10桌面系统运行 如何指定盘符呢?
如果习惯鼠标操作,就用这个吧。
http://bbs.wuyou.net/forum.php?mod=viewthread&tid=413760&fromuid=1198 dos时代菜鸟 发表于 2020-5-7 15:28
如果习惯鼠标操作,就用这个吧。
http://bbs.wuyou.net/forum.php?mod=viewthread&tid=413760&fromuid ...
谢谢,抽空了试试
页:
[1]