Board logo

标题: [系统相关] [已解决]批处理更改可移动磁盘两个相邻分区的盘符 [打印本页]

作者: z5653821    时间: 2009-10-31 20:06     标题: [已解决]批处理更改可移动磁盘两个相邻分区的盘符

在网上找到两段代码 可以更改当前盘盘符为X

如何修改能同时更改后一个盘的盘符
比如把D改成X后 把E改成Y
请各位大侠帮忙

[ 本帖最后由 z5653821 于 2009-11-11 11:42 编辑 ]
作者: lxzzr    时间: 2009-11-1 11:33     标题: 回复 1楼 的帖子

这个操作具有一定的危险性,请谨慎,最好在虚拟机上先试
  1. @echo off&setlocal enabledelayedexpansion
  2. set temp_=#XYZABDEFGHIJKLMNOPQRSTUVW
  3. rem 你要修改的顺序,C盘除外
  4. pushd %windir%\system32\
  5. for /f "skip=2 tokens=1 delims=:" %%a in ('wmic logicaldisk get name') do set /a n+=1&call :sub %%a !n!
  6. pause
  7. :sub
  8. set temp__=!temp_:%1=!
  9. echo.最终替换结果:
  10. echo %1: —→ !temp__:~%2,1!:
  11. for /f "delims=" %%a in ('mountvol %1: /l') do (
  12. mountvol %1: /d
  13. mountvol !temp__:~%2,1!: %%a
  14. )
  15. goto :eof
复制代码

[ 本帖最后由 lxzzr 于 2009-11-1 11:35 编辑 ]
作者: z5653821    时间: 2009-11-2 08:53

初来乍到就见到老大出手 呵呵 激动啊
作者: z5653821    时间: 2009-11-2 09:04

重新测试了一下
版主可能误解了我的意思

我希望的结果是:更改当前盘和当前盘后一个盘的盘符
如我的移动硬盘插上之后是 G和H 当然不同机器上盘符也不同,只是举个例子

能不能有劳版主稍加修改 把当前盘【可能是G也可能是其他盘符】和紧接着的盘符【比如是H】
分别修改为X盘和Y盘

  1. @ echo off
  2. rem 功能重新分配当前的盘符至固定盘符
  3. title 盘符重新分配
  4. cls
  5. if /i "%oldvol%"=="c:\" echo.&&echo 不能更改系统盘盘符?&&goto end
  6. del allyesno.txt>nul 2>nul
  7. rem 输出所有盘符信息至allyesno.txt文件
  8. mountvol/l>>allyesno.txt
  9. setlocal enabledelayedexpansion
  10. rem 查找当前盘符
  11. rem for %%i in (%cd%) do set oldvol=%%~di\
  12. rem 查找当前盘符对应的序列号
  13. set num=0
  14. for /f %%i in (allyesno.txt) do (
  15. set/a num+=1
  16. set allyesno=%%i
  17. if "!allyesno!"=="%oldvol%" set oldvolnum=!num!
  18. )
  19. rem 计算当前盘符VolumeName值对应的序列号
  20. set/a oldvolnamenum=!oldvolnum!-1
  21. rem 查找当前盘符VolumeName值
  22. set num=0
  23. for /f %%i in (allyesno.txt) do (
  24. set/a num+=1
  25. set allyesno=%%i
  26. if "!num!"=="!oldvolnamenum!" set oldvolname=!allyesno!
  27. )
  28. rem 删除当前盘符
  29. mountvol !oldvol! /d
  30. rem 重新分配盘符为X:
  31. mountvol x: !oldvolname!
复制代码

[ 本帖最后由 z5653821 于 2009-11-2 18:30 编辑 ]
作者: z5653821    时间: 2009-11-2 18:31

在上面的代码里面 已经得到当前盘盘符是 oldvol
那下面一个盘符应该是 oldvol+1之类的 【本人不懂bat 不知道语法格式】
有没有人能帮下忙
作者: keen    时间: 2009-11-2 19:45

只能修改两个临近的盘,比如当前盘为D盘,临近的后一个盘是E盘。把D盘改为X盘,E盘改为Y盘。
  1. @echo off
  2. set newvol1=X
  3. set newvol2=Y
  4. set  /p currvol=请输入想要修改的盘符(输入格式:D):
  5. for /f "delims=" %%i in ('mountvol %currvol%: /l') do set volname=%%i
  6. mountvol %currvol%: /d
  7. mountvol %newvol1%: %volname%
  8. set str=C D E F G H I J K L M N O P Q R S T U V W X Y Z
  9. for %%j in (%str%) do (
  10.     set /a n+=1
  11.     if %%j==%currvol% goto next
  12. )
  13. :next
  14. setlocal enabledelayedexpansion
  15. set string=%str: =%
  16. set nextvol=!string:~%n%,1!
  17. for /f "delims=" %%a in ('mountvol %nextvol%: /l') do set nextvolname=%%a
  18. mountvol %nextvol%: /d
  19. mountvol %newvol2%: %nextvolname%
复制代码

[ 本帖最后由 keen 于 2009-11-2 20:58 编辑 ]
作者: lxzzr    时间: 2009-11-2 20:45

代码不要放在要修改的盘!!!(代码会先“卸载”掉当前的盘)
作者: keen    时间: 2009-11-2 20:55     标题: 回复 7楼 的帖子

没敢测试,所以考虑不周全,谢lxzzr兄指正,那就修改一下,变成让用户输入盘符。
作者: lxzzr    时间: 2009-11-2 21:00     标题: 回复 8楼 的帖子

我开始也没仔细去想,现在把我的盘符搞得乱七八糟的,呵呵

这样应该好了:
将代码放在要修改的第一个盘里执行
  1. @echo off&setlocal enabledelayedexpansion
  2. set temp_=ABCDEFGHIJKLMNOPQRSTUVWXYZ
  3. for /l %%a in (0,1,26) do if "!temp_:~%%a,1!" == "%cd:~0,1%" (set /a temp__=%%a+1)
  4. if /i "%cd:~0,1%" == "C" (
  5.         for /f "tokens=1,2 delims=," %%a in (temp) do (
  6.         for /f "delims=" %%i in ('mountvol %%a /l') do mountvol %%a /d&mountvol X: %%i
  7.         for /f "delims=" %%j in ('mountvol %%b /l') do mountvol %%b /d&mountvol Y: %%j
  8.         )
  9.         erase temp,%~nx0&(echo.Done.&pause>nul)&goto :loop
  10.         ) else (
  11.         echo.当前:%cd:~0,1%:→X:,下一个:!temp_:~%temp__%,1!:→Y:
  12.         echo.%cd:~0,1%:,!temp_:~%temp__%,1!:>c:\temp
  13.         copy %0 c:\>nul&pushd c:&%~nx0
  14. )
  15. :loop
复制代码

[ 本帖最后由 lxzzr 于 2009-11-2 21:21 编辑 ]
作者: z5653821    时间: 2009-11-2 21:27     标题: 回复 6楼 的帖子

请教KEEN一个问题

【rem 删除当前盘符
mountvol !oldvol! /d
rem 重新分配盘符为X:
mountvol x: !oldvolname!】

如果已经知道 当前盘的盘符是oldvol  在bat里面 怎样把后面临近的一个盘表示出来
是不是: oldvol=oldvol+1 ?
只要能表示 只要在上面两行的基础上再加两行就可以了
因为移动硬盘的分区名称是已知的 我可以随意修改
作者: z5653821    时间: 2009-11-2 21:30     标题: 回复 9楼 的帖子

多谢版主 我再试试看
作者: lxzzr    时间: 2009-11-2 21:31     标题: 回复 10楼 的帖子

你应该将问题改为:批处理修改可移动磁盘盘符。^_^
作者: z5653821    时间: 2009-11-2 21:38     标题: 回复 12楼 的帖子

呵呵 我马上改下 不过
很遗憾,你的代码还是没有成功啊
作者: lxzzr    时间: 2009-11-2 21:41     标题: 回复 13楼 的帖子

汗!我插上我的手机(两个盘符),是可以的啊????
作者: z5653821    时间: 2009-11-2 21:44     标题: 回复 14楼 的帖子

..............啥情况啊 我放在g盘测试的 我在cmd里看下运行结果 =下哈。



G:\>G:\a.cmd
当前:G:→X:,下一个:H:→Y:
'a.cmd' 不是内部或外部命令,也不是可运行的程序
或批处理文件。

[ 本帖最后由 z5653821 于 2009-11-2 21:47 编辑 ]
作者: z5653821    时间: 2009-11-3 08:50

经过重新测试已经成功,上次没有成功应该是跟之前运行过批处理程序又把盘符改回来有关。
作者: z5653821    时间: 2009-11-5 10:59     标题: 还有一个问题

  1. @echo off&setlocal enabledelayedexpansion
  2. set temp_=ABCDEFGHIJKLMNOPQRSTUVWXYZ
  3. for /l %%a in (0,1,26) do if "!temp_:~%%a,1!" == "%cd:~0,1%" (set /a temp__=%%a+1)
  4. if /i "%cd:~0,1%" == "C" (
  5. for /f "tokens=1,2 delims=," %%a in (temp) do (
  6. for /f "delims=" %%i in ('mountvol %%a /l') do mountvol %%a /d&mountvol X: %%i
  7. for /f "delims=" %%j in ('mountvol %%b /l') do mountvol %%b /d&mountvol Y: %%j
  8. )
  9. erase temp,%~nx0&(echo.Done.&pause>nul)&goto :loop
  10. ) else (
  11. echo.当前:%cd:~0,1%:→X:,下一个:!temp_:~%temp__%,1!:→Y:
  12. echo.%cd:~0,1%:,!temp_:~%temp__%,1!:>c:\temp
  13. copy %0 c:\>nul&pushd c:&%~nx0
  14. )
  15. :loop
复制代码


在执行完上述代码后
如何跳出循环 进入修改后的X盘 执行其他操作
如运行某EXE程序
不好意思 我搜索了论坛里的帖子,实在看不懂
作者: zljzsmzzx    时间: 2009-11-6 10:34

下帖中第一个for中括号里的$是转义符,即数字键6上的那个符号,¥是管道符号,回车键左边“\”键上的那个符号。我是用手机上的网,手机打不出这两个符号,所以楼主自己改下吧。

[ 本帖最后由 zljzsmzzx 于 2009-11-6 10:50 编辑 ]
作者: zljzsmzzx    时间: 2009-11-6 10:37

  1. @echo off
  2. if "%~1" neq "a" (copy/y %~s0 "%temp%">nul&set nowdrv=%cd:~0,2%&cd/d "%temp%"&call %~nx0 a&exit)
  3. if/i "%nowdrv%" equ "%windir:~0,2%" (echo,系统分区不可更改。&pause&exit)
  4. setlocal enabledelayedexpansion
  5. for /f "delims=\" %%a in ('fsutil fsinfo drives$¥find /v ""') do (set/a n+=1&set drv=%%a&set drv!n!=!drv:~-2!&if /i "%nowdrv%" equ "!drv:~-2!" (set a=!n!&set/a b=!n!+1))
  6. call :set !drv%a%! X:
  7. call :set !drv%b%! Y:
  8. exit
  9. :set
  10. for /f %%i in ('mountvol %1 /l') do (mountvol %1 /d&&mountvol %2 %%i)
复制代码

作者: z5653821    时间: 2009-11-6 14:24

原帖由 zljzsmzzx 于 2009-11-6 10:37 发表
接上帖…
@echo off
if "%~1" neq "a" (set nowdrv=%cd:~0,2%© %~s0 "%temp%" >nul&cd /d "%temp%"&call %~nx0 a&exit)
if/i "%nowdrv%" equ "%windir:~0,2%" (echo,系统分区,不可更改。&pause&exit)
setl ...


将两个符号分别修改为 ^和|后经测试无效 不过还是感谢zljzsmzzx 的热心帮助
作者: z5653821    时间: 2009-11-6 14:25

原帖由 lxzzr 于 2009-11-2 21:00 发表
我开始也没仔细去想,现在把我的盘符搞得乱七八糟的,呵呵

这样应该好了:
将代码放在要修改的第一个盘里执行

@echo off&setlocal enabledelayedexpansion
set temp_=ABCDEFGHIJKLMNOPQRSTUVWXYZ
for /l % ...


执行完这段代码后还能执行别的吗?

比如
x:
x:\*.exe
作者: lxzzr    时间: 2009-11-6 15:02     标题: 回复 21楼 的帖子

这样试试
  1. @echo off&setlocal enabledelayedexpansion
  2. set temp_=ABCDEFGHIJKLMNOPQRSTUVWXYZ
  3. for /l %%a in (0,1,26) do if "!temp_:~%%a,1!" == "%cd:~0,1%" (set /a temp__=%%a+1)
  4. if /i "%cd:~0,1%" == "C" (
  5. for /f "tokens=1,2 delims=," %%a in (temp) do (
  6. for /f "delims=" %%i in ('mountvol %%a /l') do mountvol %%a /d&mountvol X: %%i
  7. for /f "delims=" %%j in ('mountvol %%b /l') do mountvol %%b /d&mountvol Y: %%j
  8. )
  9. erase temp,%~nx0&(echo.Done.&pause>nul)&goto :loop
  10. ) else (
  11. echo.当前:%cd:~0,1%:→X:,下一个:!temp_:~%temp__%,1!:→Y:
  12. echo.%cd:~0,1%:,!temp_:~%temp__%,1!:>c:\temp
  13. copy %0 c:\>nul&pushd c:&%~nx0
  14. )
  15. :loop
  16. pushd X:
  17. x:\*.exe
复制代码

作者: zljzsmzzx    时间: 2009-11-6 18:43     标题: 回20楼

.楼主测试失败是因为原代码中一个copy命令不知为什么被替换掉了。现代码在19楼已修改。如果你要修改的盘是G盘和H盘,只要把批处理文件放到G盘下任意位置运行即可。如果还要执行其它命令就在call :set !drv%b%! Y:后加上cd/d x:,再在exit前加上自己要执行的命令就可以了。我测试了没问题。
作者: zljzsmzzx    时间: 2009-11-6 18:44     标题: 回20楼

.楼主测试失败是因为原代码中一个copy命令不知为什么被替换掉了。现代码在19楼已修改。如果你要修改的盘是G盘和H盘,只要把批处理文件放到G盘下任意位置运行即可。如果还要执行其它命令就在call :set !drv%b%! Y:后加上cd/d x:,再在exit前加上自己要执行的命令就可以了。我测试了没问题。
作者: z5653821    时间: 2009-11-7 11:03

  1. @echo off
  2. if "%~1" neq "a" (copy/y %~s0 "%temp%">nul&set nowdrv=%cd:~0,2%&cd/d "%temp%"&call %~nx0 a&exit)
  3. if/i "%nowdrv%" equ "%windir:~0,2%" (echo,系统分区不可更改。&pause&exit)
  4. setlocal enabledelayedexpansion
  5. for /f "delims=\" %%a in ('fsutil fsinfo drives^|find /v ""') do (set/a n+=1&set drv=%%a&set drv!n!=!drv:~-2!&if /i "%nowdrv%" equ "!drv:~-2!" (set a=!n!&set/a b=!n!+1))
  6. call :set !drv%a%! X:
  7. call :set !drv%b%! Y:
  8. cd/d x:
  9. rem 重新启动vstart.exe
  10. taskkill /F /IM Vstart.exe
  11. x:
  12. cd\
  13. vstart.exe
  14. exit
  15. :set
  16. for /f %%i in ('mountvol %1 /l') do (mountvol %1 /d&&mountvol %2 %%i)
复制代码


请问是这样做吗?
我测试了一下 还是不行啊
悲剧,版主你的办法也还是不行啊

我想要改变盘符之后在X盘中重启一个vstart.exe的程序

  1. rem 重新启动vstart.exe
  2. taskkill /F /IM Vstart.exe
  3. x:
  4. cd\
  5. vstart.exe
复制代码

作者: zljzsmzzx    时间: 2009-11-7 17:59

楼主,你不要上来只说个不行啊什么的。你倒是说说哪不行了。是盘符依然没修改成功呢还是盘符改了但没重新启动那个程序呢?还有你的那个程序是在要修改盘符的那个移动磁盘里吗?这些你都要说清楚啊,你只一句不行我们就有得忙了,不但要找代码错在哪还得猜测你运行的时候错在哪。我每次给人写代码都经测试没问题后才会给出的。但我测试的环境和你使用的环境不同,所以每个问题都要你主动说清了我们才能针对你的使用环境修改代码,问一句答一句只会让你的问题越拖越久甚至没人愿意回答。
作者: z5653821    时间: 2009-11-8 17:57     标题: 回复 26楼 的帖子

放在第一个分区根目录下运行 运行了之后窗口一闪而过,什么反映都没有 你说我能说什么呢?
作者: zljzsmzzx    时间: 2009-11-10 12:41

  1. @echo off
  2. if "%~1" neq "a" (set nowdrv=%cd:~0,2%&copy %~s0 "%temp%" >nul&cd/d "%temp%"&call %~nx0 a&exit)
  3. if /i "%nowdrv%" equ "c:" (echo,当前驱动器可能是系统分区,不可更改。&pause>nul&exit)
  4. setlocal enabledelayedexpansion
  5. for /f "delims=\" %%a in ('fsutil fsinfo drives^|find /v ""') do (
  6.     set/a n+=1
  7.     set drv=%%a
  8.     set drv!n!=!drv:~-2!
  9.     if /i "%nowdrv%" equ "!drv:~-2!" (set a=!n!&set/a b=!n!+1)
  10. )
  11. call :set !drv%a%! X:
  12. call :set !drv%b%! Y:
  13. cd/d x:
  14. taskkill /F /IM Vstart.exe
  15. start "" x:\Vstart.exe
  16. rem 如果只是运行这个程序而已就可以不用前面那句cd/d x:
  17. exit
  18. :set
  19. for /f %%i in ('mountvol %1 /L') do (mountvol %1 /d && mountvol %2 %%i)
复制代码
这次是在网吧里上了,测试过,没有问题,再不行的话那就是你电脑的个别问题了。
作者: z5653821    时间: 2009-11-10 16:35     标题: 回复 28楼 的帖子

各位辛苦了  特别是zljzsmzzx  用手机写了那么多代码  非常不容易

我已经找到替代的方法了 版主请锁此贴 至于28楼的代码 我测试了下

症状还是差不多,可能真的是电脑的问题,我在机房上网的 放在根目录下运行

没有任何反映

再次感谢




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2