无忧启动论坛

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

【请转至新贴】盘符错乱调整批处理

[复制链接]
241#
 楼主| 发表于 2009-2-10 12:51:26 | 只看该作者
回复

使用道具 举报

242#
发表于 2009-2-18 11:08:26 | 只看该作者
在PE下很好用,谢谢。顶个。
回复

使用道具 举报

243#
发表于 2009-4-18 13:56:34 | 只看该作者
支持一下,谢谢楼主分享!
回复

使用道具 举报

244#
发表于 2009-4-28 05:22:59 | 只看该作者
感谢分享,收藏备用!!!
回复

使用道具 举报

245#
 楼主| 发表于 2009-6-3 22:50:03 | 只看该作者
BUG修正了,现在开始修订教程。
回复

使用道具 举报

246#
发表于 2009-6-3 23:05:07 | 只看该作者
h3大的更新可能没赶上这个修正吧?
不知道v版事先有没有给h3大提前供应此修正啊 ;>
回复

使用道具 举报

247#
发表于 2009-6-4 01:29:52 | 只看该作者
才下的水哥的全内置得搞下,谢谢修正
回复

使用道具 举报

248#
发表于 2009-6-4 01:32:55 | 只看该作者
等出来了最终版再替换到hhh333的pe里。希望还是那几个文件^_^。
回复

使用道具 举报

249#
发表于 2009-6-4 06:14:44 | 只看该作者
vrctor888

谢谢你研究的成果.

以往的就很好.下次更新PE.会立即跟进最新....
回复

使用道具 举报

250#
发表于 2009-6-4 08:58:00 | 只看该作者
原帖由 victor888 于 2008-11-20 19:17 发表
这是一次重要的更新,请重新下载!
硬盘盘符的顺序根据offset值来调整,而不是以前的经验上的顺序来调整,这才是真正准确的方式,MBRFIX版已经调试通过,DISKPART版调试中,明日亦会提供下载!
教程在原理讨论 ...


以前没仔细看,直接拿来用了,刚才看了一下,这个在PE中用似乎可以更简洁一点
1、因为这个一般要放在load外置之前,因此多数情况下是要放到内核中的,因此内核是什么系统应该是固定的,判断语句可以不要了。
2、我不知道为什么要将这个程序放到system32\temp下执行,PE中直接在system32下执行应该也是无问题的。
由于mountvol这个程序是系统自带的,因此应该只需要MbrFix.exe和批处理就可以了。按以上思路改成如下形式:
(当然,如果放在其他地方用可能还是要用原程序。另外,要提醒一点的就是这个程序是需要FIND程序的,有次我将FIND程序请出了内核,理顺盘符就失败了。可以在前面的说明中申明一下,这个批处理需要FIND程序的支持的,这样就更明朗了。)

::revised on Jun 6, 2009
::created by victor888, QQ:511519860
::ordering drive letters by drive type
::ordered drive letters are assigned to fixed disk, cdrom, usb hard disk and usb stick
::"find.exe" must be in system or path environment variable point to.
@echo off
SETLOCAL ENABLEEXTENSIONS
SETLOCAL ENABLEDELAYEDEXPANSION
::get all drive letters
wmic /? >nul 2>&1
if errorlevel 1 (
  for /f "tokens=1 delims=  " %%a in ('REG QUERY HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2\ /s ^|find "2\\"') do (
    set adv=%%a
    set adv=!adv:~-3!
    set tdv=!adv:~0,2!
    if !tdv! equ \\ (
      set adv=!adv:~-1!
      set ALLDRV=!ALLDRV! !adv!
    )
  )
) else (
  for /f "skip=1" %%a in ('wmic logicaldisk get caption') do (
    set adv=%%a
    set ALLDRV=!ALLDRV! !adv!
  )
)
set ALLDRV=%ALLDRV::=%
::get all mounted volume ids and drive letters
FOR /F %%a in ('mountvol ^|find "\"') do set mtvdrv=!mtvdrv! %%a
set mtvdrv=%mtvdrv: =%
set mtvdrv=%mtvdrv:\\?\Volume= %
set mtvdrv=%mtvdrv:\=%
set mtvdrv=%mtvdrv::=%
for %%a in (%mtvdrv%) do (
  set mdrv=%%a
  set mdrv=!mdrv:~-1!
  set mtdrv=!mtdrv! !mdrv!
)
rem echo Mounted drive letters: %mtdrv%
::get virtual drive letters
set virdrv=%ALLDRV%
for %%a in (%mtdrv%) do (
  set virdrv=!virdrv:%%a=!
)
for %%a in (%virdrv%) do set newvirdrv=!newvirdrv! %%a
if defined newvirdrv (
  set virdrv=!newvirdrv!
)
::get system volumeid
call :vid_drv %systemdrive:~0,1%
set systemvid=%vd%
::get innternal hard disk number from registry
for /f "skip=1 tokens=1,3 delims=  " %%a in ('reg query HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Disk\Enum /s ^|find "\"') do (
  set dtype=%%b
  set dtype=!dtype:~0,3!
  if /i !dtype! neq USB (
    set /a m+=1
    set hdnum!m!=%%a
  )
)
::two founds with using batch file
::1. "?" can not be as an element of string in the for command
::2. one variable can not contain another varable in for command i.e. for %%a in (!ab%c%!) do ..., !ab%c%! has no value
::get innternal hard disk signature and its volume ids
for /l %%a in (1,1,!m!) do (
  set /a n=0
  for /f %%b in ('mbrfix /drive !hdnum%%a! readsignature') do set sigcode=%%b
  for /l %%c in (0,1,7) do set newcode=!newcode! !sigcode:~%%c,1!
  for %%d in (!newcode!) do set /a n+=1
  if !n! lss 8 (
    set /a zeronum=8-!n!
    for /l %%e in (1,1,!zeronum!) do set sigcode=0!sigcode!
  )
  for /l %%c in (0,2,6) do set resigcode=!sigcode:~%%c,2!!resigcode!
  for /f "tokens=1,3 delims=  " %%d in ('REG QUERY HKLM\SYSTEM\MountedDevices\ /s ^|FIND "Volume" ^|find "!resigcode!"') do (
    set vid=%%d
    set vid=!vid:~10,38!
    set partlen=%%e
    set partlen=!partlen:~10,10!
    for /l %%g in (0,2,8) do set repartlen=!partlen:~%%g,2!!repartlen!
    for /f "delims=0 tokens=*" %%i in ("!repartlen!") do set repartlen=%%i  
    call set hdptlen%%a=0x!repartlen! %%hdptlen%%a%%
    call set hdvidreptlen%%a=%%hdvidreptlen%%a%% !vid!#0x!repartlen!
    set repartlen=
  )
  set resigcode=
  call :sort !hdptlen%%a!
  for %%f in (!ret!) do (
    for %%b in (!hdvidreptlen%%a!) do (
      for /f "delims=# tokens=1,2" %%c in ("%%b") do (
        if %%d equ %%f (
          call set hdvid%%a=%%hdvid%%a%% %%c
          set ret=!ret:%%b=!
        )
      )
    )
  )
  set ret=
)
::get hard disk drive letters according to their volume ids
for /l %%a in (1,1,%m%) do (
    for %%b in (!hdvid%%a!) do (
      call :vid_drv %%b
      set hddrv%%a=!hddrv%%a! !vd!
    )
    set hdvid=!hdvid! !hdvid%%a!
    set hddrv=!hddrv! !hddrv%%a!
    set newhddrv=
    for %%c in (!hddrv%%a!) do set newhddrv=!newhddrv! %%c
    set hddrv%%a=!newhddrv!
  )
)
::get other drive letters and volume ids including removable and usb hard disk and cdrom
set otherdrv=%mtdrv%
for %%a in (%hddrv%) do set otherdrv=!otherdrv:%%a=!
set /a n=0
for %%a in (%otherdrv%) do (
  for /f "skip=2 tokens=3 delims=  " %%b in ('reg query HKLM\SYSTEM\MountedDevices /v \DosDevices\%%a:') do (
    set mnreg=%%b
    set first8=!mnreg:~0,8!
  )
  if /i !first8! equ 5f003f00 set remdrv=!remdrv! %%a
  if /i !first8! equ 5c003f00 (
    set mnreg=!mnreg:23=#!
    for /f "tokens=2 delims=#" %%c in ("!mnreg!") do (
      set tpcode=%%c
      set tpcode=!tpcode:~0,12!
      if /i !tpcode! equ 00470045004E set flpdrv=!flpdrv! %%a
      if /i !tpcode! equ 004300640052 set dvddrv=!dvddrv! %%a
      if /i !tpcode! equ 00520065006D set remdrv=!remdrv! %%a
    )
  )
  if /i !first8! neq 5c003f00 (
    if /i !first8! neq 5f003f00 (
      if not defined var_!first8! (
        set var_!first8!=%%a
      ) else (
        call set var_!first8!=%%var_!first8!%% %%a
      )
    )
  )
)
for /f "tokens=2-3 delims=_=" %%h in ('set var_ 2^>nul') do (
  set /a n=n+1
  set uhddrv!n!=%%i
)
for /l %%a in (1,1,%n%) do (
  for %%b in (!uhddrv%%a!) do (
    call :vid_drv %%b
    set uhdvid%%a=!uhdvid%%a! !vd!
  )
   set uhddrv=!uhddrv! !uhddrv%%a!
   set uhdvid=!uhdvid! !uhdvid%%a!
)
for %%a in (%dvddrv%) do (
  call :vid_drv %%a
  set dvdvid=!dvdvid! !vd!
)
for %%a in (%remdrv%) do (
  call :vid_drv %%a
  set remvid=!remvid! !vd!
)
set totaldrv=%hddrv% %dvddrv% %uhddrv% %remdrv%
set totalvid=%hdvid% %dvdvid% %uhdvid% %remvid%
::remove system drive letters and volume ids
set tempdrv=%virdrv%
set tempdrv=!tempdrv:%systemdrive:~0,1%=!
if /i !tempdrv! equ !virdrv! (
  set totaldrv=!totaldrv:%systemdrive:~0,1%=!
  set totalvid=!totalvid:%systemvid%=!
)
set totalvid=%totalvid: =%
set fulldrv=CDEFGHIJKLMNOPQRSTUVWXYZ
for %%a in (%virdrv%) do set fulldrv=!fulldrv:%%a=!
set fulldrv=!fulldrv:%systemdrive:~0,1%=!
::ordering drive letters start
set /a e=0
for %%a in (%totaldrv%) do (
  call :vdrv %%a
  set /a k=k+1
  set /a e=e+38
)
for %%a in (%viddrv%) do (
  set temp=%%a
  set vid=!temp:~0,38!
  set drv=!temp:~-1!
  mountvol !drv!: \\?\Volume!vid!
)

:vdrv
set nk=!fulldrv:~%k%,1!
if /i %1 neq !nk! (
  set ordereddrv=!ordereddrv! %1→!nk!
  mountvol %1: /d
  set viddrv=!viddrv! !totalvid:~%e%,38!!nk!
)
goto :eof
:vid_drv
for %%a in (%mtvdrv%) do (
  set vd=%%a
  set l=%1
  set l=!l:~0,1!
  if !l! equ { (
    set rd=!vd:~0,38!
    if !rd! equ %1 (
      set vd=!vd:~-1!      
      set mtvdrv=!mtvdrv:%%a=!
      goto :eof
    )
  ) else (
    set rd=!vd:~-1!
    if !rd! equ %1 (
      set vd=!vd:~0,38!
      if %1 neq %systemdrive:~0,1% set mtvdrv=!mtvdrv:%%a=!
      goto :eof
    )
  )
)
goto :eof
:sort
  set num=%1
  set str= %*
  for %%i in (%*) do if !num! gtr %%i set num=%%i
  set ret=%ret% %num%
  if not "!str: %num% =!"=="" call :sort !str: %num% =  !
goto :eof

[ 本帖最后由 hhh333 于 2009-6-4 09:12 编辑 ]
回复

使用道具 举报

251#
 楼主| 发表于 2009-6-4 10:13:23 | 只看该作者
赞楼上,自己定制是最好的。
回复

使用道具 举报

252#
发表于 2009-6-4 23:52:54 | 只看该作者
请问
怎么去掉这个提示 ??


也就是程序运行完成后可以自动关闭    谢谢

[ 本帖最后由 wangpeng 于 2009-6-4 23:55 编辑 ]
回复

使用道具 举报

253#
发表于 2009-6-5 00:07:43 | 只看该作者
虚拟盘的盘符是可以不动,它的源镜像文件所在的盘的盘符动了咋办?
回复

使用道具 举报

254#
发表于 2009-6-5 00:14:17 | 只看该作者
更新了下自己YY的PE,很好。谢谢楼主。
回复

使用道具 举报

255#
发表于 2009-6-5 00:16:53 | 只看该作者
自己找到了   删除 pause
回复

使用道具 举报

256#
发表于 2009-6-5 10:00:43 | 只看该作者
重大的修正,期待iso的更新
回复

使用道具 举报

257#
 楼主| 发表于 2009-6-5 10:58:07 | 只看该作者
原帖由 lelexiong 于 2009-6-5 00:07 发表
虚拟盘的盘符是可以不动,它的源镜像文件所在的盘的盘符动了咋办?


请问源镜像文件是指什么?
回复

使用道具 举报

258#
 楼主| 发表于 2009-6-5 10:59:11 | 只看该作者
252楼,你的结果不正确啊,你是如何运行的?启动PE后运行的?
回复

使用道具 举报

259#
发表于 2009-6-5 12:26:59 | 只看该作者
谢谢楼主,下载更新..
回复

使用道具 举报

260#
发表于 2009-6-5 12:41:47 | 只看该作者
我看这个是6月3日的文件,兄弟6月4日的另一帖中说还有bug,什么时候出修正版?
回复

使用道具 举报

261#
发表于 2009-6-5 13:13:20 | 只看该作者
试试看下来怎么样,辛苦lz啦
回复

使用道具 举报

262#
发表于 2009-6-5 19:48:44 | 只看该作者
原帖由 victor888 于 2009-6-5 10:59 发表
252楼,你的结果不正确啊,你是如何运行的?启动PE后运行的?


我是在 Win9PE下运行的.



[ 本帖最后由 wangpeng 于 2009-6-5 20:19 编辑 ]
回复

使用道具 举报

263#
发表于 2009-6-5 20:14:36 | 只看该作者
没有下载地址啊。~~~~~~~~~~
回复

使用道具 举报

264#
发表于 2009-6-5 21:06:55 | 只看该作者
期待中,希望这次真的能完美解决。
回复

使用道具 举报

265#
 楼主| 发表于 2009-6-5 22:17:01 | 只看该作者
来了,我可以休息一下了。
回复

使用道具 举报

266#
发表于 2009-6-5 22:41:03 | 只看该作者
完工了,辛苦,顶一下。
回复

使用道具 举报

267#
发表于 2009-6-5 22:43:12 | 只看该作者
总共只有几K?
如果还需要一些配套文件的话,希望楼主能一并在一楼完整提供。
回复

使用道具 举报

268#
发表于 2009-6-5 22:46:34 | 只看该作者
哈哈终于来啦,支持支持一下,等了好久了,可以更新到h3的pe里面了
回复

使用道具 举报

269#
发表于 2009-6-5 22:46:42 | 只看该作者
恭喜恭喜 期待各位制作PE的大大们能积极响应~
回复

使用道具 举报

270#
 楼主| 发表于 2009-6-5 22:48:37 | 只看该作者
pseudo
你来了我非常的高兴

所用的外部工具,只有mbrfix.exe
所用到的WIN外部命令如下:

find
reg
mountvol
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-5-1 10:21

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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