无忧启动论坛

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

[原创] 更改分区盘符的批处理

[复制链接]
跳转到指定楼层
#
发表于 2022-7-10 03:18:47 | 显示全部楼层 回帖奖励 |正序浏览 |阅读模式
本帖最后由 linqyx 于 2023-9-4 18:23 编辑

更好的作品请看 dos时代菜鸟在 11楼、17楼、20楼和26楼 作者的作品,我这个是自己练习弄着玩的,简陋。

功能很单一,方便更改某一分区的盘符。
注意:千万不要更改系统盘符!千万不要更改系统盘符!千万不要更改系统盘符!
两个文件区别:
更改分区盘符操作简单,退出不删除c:盘目录下的 更改分区盘符.bat文件,盘符已经存在的话不提示直接退出。

更改分区盘符v1.0

相对另一个操作比较繁琐,除非鼠标x掉批处理,批处理自行退出会自己删掉 更改分区盘符.bat文件,如果盘符已经存在会提示重新输入。



更改分区盘符.zip

1.16 KB, 下载次数: 103, 下载积分: 无忧币 -2

更改分区盘符v1.0.zip

1.12 KB, 下载次数: 89, 下载积分: 无忧币 -2

更新一些功能,但是比较繁琐

9#
发表于 2023-7-29 09:45:27 | 显示全部楼层
本帖最后由 dos时代菜鸟 于 2023-7-29 09:54 编辑

原来 win10 没有 "fsutil volume querylabel" 这个命令了
取而代之的是 "fsutil fsinfo volumeinfo"

m3.7z (1.38 KB, 下载次数: 9)

用 fsutil 可以显示没有盘符的分区卷对应的卷标,这样操作起来更有针对性一些。



回复

使用道具 举报

8#
发表于 2022-7-12 09:09:45 | 显示全部楼层
关于编码 代码页 的问题
win10 下

可以 用
  1. mode con: cp select=65001
复制代码

把代码页设置为 utf-8

批处理文件 另存为 utf-8 编码,文件

运行时 ,就能完美支持中文 utf-8
回复

使用道具 举报

7#
发表于 2022-7-11 19:32:48 | 显示全部楼层
linqyx 发表于 2022-7-11 16:50
谢谢,学习了。

这个 批处理有瑕疵
回复

使用道具 举报

6#
发表于 2022-7-11 19:25:00 | 显示全部楼层
本帖最后由 dos时代菜鸟 于 2022-7-11 19:34 编辑

其实批处理 ,就是 把 分析各种文本流信息,找出自己需要的,显示出来,形成交互界面,或者自动运行。最终 达到想要的目的。

用for /f  配合 if  和 Set 就基本上可以实现 文本流信息的分析
下面这个是用  for /f  + if + Set  分析 fsutil volume 指令的输出结果,获取 本地电脑各卷 盘符 和  卷标。
然后 , 根据用户所选,通过 mountvol 实现 对某个卷的 盘符装卸和更改。

因为  中文 和 英文 的文本流 不一样,所以 需要事先 用 chcp 437 把代码页 设置为  英文,需要交互界面时,再设置为 936.


m2.7z (1.26 KB, 下载次数: 14)


  1. @echo off
  2. setlocal enabledelayedexpansion
  3. title MOUNTVOL 盘符装卸脚本
  4. :main
  5. chcp 437
  6. set n=0
  7. set ltr_s=
  8. for /f "delims=" %%c in ('fsutil volume list') do (
  9.     set str1=%%c
  10.     rem 对字符串去空格处理
  11.     set str1=!str1: =!
  12.    
  13.     if defined m ( rem 如果定义了 变量m 说明上一条字符串 是一个卷内容,且本行字符串 是该卷对应的盘符
  14.         if "!str1:~1,1!"==":" ( rem 如果本行字符串第二个字符是 : 说明 是一个有效的盘符
  15.             set ltr=!str1:~0,2!
  16.                 rem 把 盘符存入 变量 ltr_s 中
  17.             set "ltr_s=!ltr_s! !str1:~0,1!"
  18.         ) else (
  19.             set "ltr=*:"
  20.         )
  21.         
  22.         for /f "tokens=6 delims= " %%u in ('fsutil volume querylabel !vol!') do (set label=%%u)

  23.         rem 设置包含序号的 vol 变量内容,如 vol1 vol2 vol3 vol4 .......
  24.         set vol!n!=!m:~-2!.   !ltr!   !vol!     !label!
  25.         set m=
  26.         set vol=
  27.     )
  28.     if "!str1:~0,1!"=="" (  rem 如果本行字符串第一个字符 是 \ 说明是 个卷,把改行信息出入 vol 变量并设置 m 变量
  29.         set /a n=!n!+1
  30.         set m= !n!
  31.         set vol=!str1!
  32.     )
  33. )
  34. chcp 936
  35. cls
  36. echo MOUNTVOL 盘符装卸脚本
  37. echo 序号--盘符-----卷------------------------------------------------卷标-----
  38. for /l %%c in (1,1,!n!) do (echo !vol%%c!)

  39. echo ----------------------------------------
  40. echo 已占用盘符!ltr_s!
  41. SET ltr0= A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
  42. for %%c in (!ltr_s!) DO (  set ltr0=!ltr0: %%c=!)
  43. echo 空闲盘符  !ltr0!
  44. echo ----------------------------------------
  45. set x=0
  46. set /p x="请选择一个要操作的卷(1-!n!,默认输入0退出):_"
  47. echo ----------------------------------------
  48. if !x!==0 goto :eof
  49. for %%c in (!x!) do (
  50.     if defined vol%%c (
  51.         for /f  "tokens=1,2,3 delims= " %%x in ('echo !vol%%c!') do (
  52.             echo ------------------------------------
  53.             echo 你选择了 %%x
  54.             echo 对应盘符 %%y
  55.             echo 对应卷是 %%z
  56.             echo ------------------------------------
  57.             rem 以下内容对卷进行 盘符装卸操作
  58.             if /i "%%y"=="%systemdrive%" (
  59.                 echo 系统所在卷,盘符不可更改。
  60.                 pause
  61.                 goto :end1
  62.             )            
  63.             set ltr_x=
  64.             set /p ltr_x="请输入一个新盘符(输入0卸载该卷盘符):_"
  65.             if !ltr_x!==0 (
  66.                 if not "%%y"=="*:" (
  67.                     mountvol %%y\ /d
  68.                 ) else (
  69.                     echo 没有盘符,不需要卸载.
  70.                     pause
  71.                 )
  72.             ) else (
  73.                 set find=0
  74.                 for %%r in (!ltr0!) do (
  75.                     if /i "%%r"=="!ltr_x!" (set "find=1")
  76.                 )
  77.                 if !find!==1 (
  78.                     if not "%%y"=="*:" (mountvol %%y\ /d)
  79.                     mountvol !ltr_x!:\ %%z
  80.                 ) else (
  81.                     echo 盘符输入错误,不是空闲盘符。
  82.                     pause
  83.                 )
  84.             )
  85.         )
  86.     ) else (
  87.         echo 输入错误,重新来过.
  88.         pause
  89.     )
  90. )
  91. :end1
  92. goto :main
复制代码




回复

使用道具 举报

5#
发表于 2022-7-11 19:16:39 | 显示全部楼层
aichong168 发表于 2022-7-10 15:48
我一般用系统自带的磁盘管理功能区修改

我通常用自制 diskpart 图形界面脚本 完成。
回复

使用道具 举报

4#
发表于 2022-7-11 19:15:32 | 显示全部楼层
linqyx 发表于 2022-7-11 17:17
不仅学习了知识,写批处理的格式也学习了。以前看到的批处理基本都是从每行行首开始,不知怎么缩进。现在 ...

python 习惯了
回复

使用道具 举报

3#
发表于 2022-7-11 10:01:47 | 显示全部楼层
本帖最后由 dos时代菜鸟 于 2022-7-11 19:32 编辑

仅供参考

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. title MOUNTVOL 盘符装卸脚本
  4. :main
  5. cls
  6. echo MOUNTVOL 盘符装卸脚本
  7. echo 序号--盘符-----卷-------------------------------------------------
  8. set n=0
  9. set ltr_s=
  10. for /f "delims=" %%c in ('mountvol /l') do (
  11.     set str1=%%c
  12.     rem 对字符串去空格处理
  13.     set str1=!str1: =!
  14.    
  15.     if defined m ( rem 如果定义了 变量m 说明上一条字符串 是一个卷内容,且本行字符串 是该卷对应的盘符
  16.         if "!str1:~1,1!"==":" ( rem 如果本行字符串第二个字符是 : 说明 是一个有效的盘符
  17.             set ltr=!str1:~0,2!
  18.                 rem 把 盘符存入 变量 ltr_s 中
  19.             set "ltr_s=!ltr_s! !str1:~0,1!"
  20.         ) else (
  21.             set "ltr=*:"
  22.         )
  23.         echo !m:~-2!.    !ltr!      !vol!
  24.         rem 设置包含序号的 vol 变量内容,如 vol1 vol2 vol3 vol4 .......
  25.         set vol!n!=!m:~-2!.   !ltr!   !vol!
  26.         set m=
  27.         set vol=
  28.     )
  29.     if "!str1:~0,1!"=="" (  rem 如果本行字符串第一个字符 是 \ 说明是 个卷,把改行信息出入 vol 变量并设置 m 变量
  30.         set /a n=!n!+1
  31.         set m= !n!
  32.         set vol=!str1!
  33.     )
  34. )
  35. echo ----------------------------------------
  36. echo 已占用盘符!ltr_s!
  37. SET ltr0= A B C D E F G H I J K L M N O P Q R S T U V W X Y Z
  38. for %%c in (!ltr_s!) DO (  set ltr0=!ltr0: %%c=!)
  39. echo 空闲盘符   !ltr0!
  40. echo ----------------------------------------
  41. set x=0
  42. set /p x="请选择一个要操作的卷(1-!n!,默认输入0退出):_"
  43. echo ----------------------------------------
  44. if !x!==0 goto :eof
  45. for %%c in (!x!) do (
  46.     if defined vol%%c (
  47.         for /f  "tokens=1,2* delims= " %%x in ('echo !vol%%c!') do (
  48.             echo ------------------------------------
  49.             echo 你选择了 %%x
  50.             echo 对应盘符 %%y
  51.             echo 对应卷是 %%z
  52.             echo ------------------------------------
  53.             rem 以下内容对卷进行 盘符装卸操作
  54.             if /i "%%y"=="%systemdrive%" (
  55.                 echo 系统所在卷,盘符不可更改。
  56.                 pause
  57.                 goto :end1
  58.             )            
  59.             set ltr_x=
  60.             set /p ltr_x="请输入一个新盘符(输入0卸载该卷盘符):_"
  61.             if !ltr_x!==0 (
  62.                 if not "%%y"=="*:" (
  63.                     mountvol %%y\ /d
  64.                 ) else (
  65.                     echo 没有盘符,不需要卸载.
  66.                     pause
  67.                 )
  68.             ) else (
  69.                 set find=0
  70.                 for %%r in (!ltr0!) do (
  71.                     if /i "%%r"=="!ltr_x!" (set "find=1")
  72.                 )
  73.                 if !find!==1 (
  74.                     if not "%%y"=="*:" (mountvol %%y\ /d)
  75.                     mountvol !ltr_x!:\ %%z
  76.                 ) else (
  77.                     echo 盘符输入错误,不是空闲盘符。
  78.                     pause
  79.                 )
  80.             )
  81.         )
  82.     ) else (
  83.         echo 输入错误,重新来过.
  84.         pause
  85.     )
  86. )
  87. :end1
  88. goto :main
复制代码





mount2.PNG (25.08 KB, 下载次数: 166)

mount2.PNG

mount1.PNG (27.64 KB, 下载次数: 183)

mount1.PNG
回复

使用道具 举报

2#
发表于 2022-7-11 08:12:44 | 显示全部楼层
linqyx 发表于 2022-7-11 01:02
@echo off
mode con cols=40 lines=20
setlocal enabledelayedexpansion

仅供参考

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. :main
  4. cls
  5. echo -------卷列表----------
  6. set n=0
  7. set ltr_s=
  8. for /f "delims=" %%c in ('mountvol') do (
  9.     set str1=%%c
  10.       rem 对字符串去空格处理
  11.     set str1=!str1: =!
  12.    
  13.     if defined m ( rem 如果定义了 变量m 说明上一条字符串 是一个卷内容,且本行字符串 是该卷对应的盘符
  14.         if "!str1:~1,1!"==":" ( rem 如果本行字符串第二个字符是 : 说明 是一个有效的盘符
  15.             set ltr=!str1:~0,2!
  16.                 rem 把 盘符存入 变量 ltr_s 中
  17.             set "ltr_s=!ltr_s! !str1:~0,2!"
  18.         ) else (
  19.             set ltr=
  20.         )
  21.         echo !m:~-2!.   !vol!   !ltr!
  22.             rem 设置包含序号的 vol 变量内容,如 vol1 vol2 vol3 vol4 .......
  23.         set vol!n!=!m:~-2!.   !vol!   !ltr!
  24.         set m=
  25.         set vol=
  26.     )
  27.     if "!str1:~0,1!"=="" (  rem 如果本行字符串第一个字符 是 \ 说明是 个卷,把改行信息出入 vol 变量并设置 m 变量
  28.         set /a n=!n!+1
  29.         set m= !n!
  30.         set vol=!str1!
  31.     )
  32. )
  33. echo 已占用盘符:!ltr_s!
  34. set /p x="请选择一个要操作的卷:(1-!n!,输入0退出)"
  35. if !x!==0 goto :eof
  36. for %%c in (!x!) do (
  37.     if defined vol%%c (
  38.         for /f  "tokens=1,2* delims= " %%x in ('echo !vol%%c!') do (
  39.             echo ------------------------------------
  40.             echo 你选择了 %%x
  41.             echo 对应卷是 %%y
  42.             echo 对应盘符 "%%z"
  43.             echo ------------------------------------
  44.         )
  45.     ) else (
  46.         echo 输入错误,重新来过!
  47.     )
  48. )
  49. pause
  50. goto :main
复制代码
回复

使用道具 举报

1#
发表于 2022-7-10 20:16:56 | 显示全部楼层
linqyx 发表于 2022-7-10 18:40
pushd 命令可以判断输入的盘符是否已经存在。
我刚学习批处理不久,3.通常我们更需要 把 没有分配盘符的 ...

慢慢来,不着急,

其实,用 mountvol 可以获取 卷列表和 盘符列表,你给 卷 做个编号,让用户选择 需要分配盘符的 无盘符卷,就可以了。
回复

使用道具 举报

#
发表于 2022-7-10 11:17:08 | 显示全部楼层
建议:
1.通过 mountvol 或者其他命令 获取已存在的 盘符列表 并显示出来
2.通过 已存在的 盘符列表 判断用户 输入是否正确
3.通常我们更需要 把 没有分配盘符的卷 给分配个盘符

点评

pushd 命令可以判断输入的盘符是否已经存在。 我刚学习批处理不久,3.通常我们更需要 把 没有分配盘符的卷 给分配个盘符 对我来说,比较难。  详情 回复 发表于 2022-7-10 18:40
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-6-4 00:56

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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