linqyx 发表于 2022-7-10 03:18:47

更改分区盘符的批处理

本帖最后由 linqyx 于 2023-9-4 18:23 编辑

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

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

更改分区盘符v1.0

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



liangnijian 发表于 4 天前

谢谢分享

wahmlt 发表于 2023-9-12 10:21:45


谢谢分享

linqyx 发表于 2023-9-5 21:38:05

wfg1555 发表于 2023-7-29 23:20
有些时候安装系统,就乱了。

安装系统最莽的做法就是不分三七二十一,直接安装C盘。一般是要在分区中先看所选择系统分区的盘符,再把系统安装到对应的盘符。更稳妥的是,安装系统的时候看一下选择的分区的盘符和大小是不是和目标分区相符。

LHChang 发表于 2023-9-5 10:38:54


谢谢分享!!!!

2010yuhongxi 发表于 2023-9-4 16:21:58

谢谢分享

wfg1555 发表于 2023-7-29 23:20:20

有些时候安装系统,就乱了。

crsx 发表于 2023-7-29 10:50:58

真不错。感谢。

dos时代菜鸟 发表于 2023-7-29 09:45:27

本帖最后由 dos时代菜鸟 于 2023-7-29 09:54 编辑

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



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



创新科技2015 发表于 2023-7-28 22:23:36


谢谢分享。

fs9999 发表于 2022-10-24 20:24:30

有用

创新科技2015 发表于 2022-10-24 11:49:26


感謝樓主分享

2011matrixvexx 发表于 2022-7-14 15:55:05

感謝樓主分享

逍遥逸仙 发表于 2022-7-14 13:24:34

感谢分享!!

dos时代菜鸟 发表于 2022-7-12 09:09:45

关于编码 代码页 的问题
win10 下

可以 用
mode con: cp select=65001
把代码页设置为 utf-8

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

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

linqyx 发表于 2022-7-11 20:16:42

481416322 发表于 2022-7-11 17:30
看了半天才知道谁是真正的楼主

楼主是菜鸟

dos时代菜鸟 发表于 2022-7-11 19:32:48

linqyx 发表于 2022-7-11 16:50
谢谢,学习了。

这个 批处理有瑕疵

dos时代菜鸟 发表于 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.





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

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

echo ----------------------------------------
echo 已占用盘符!ltr_s!
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
for %%c in (!ltr_s!) DO (set ltr0=!ltr0: %%c=!)
echo 空闲盘符!ltr0!
echo ----------------------------------------
set x=0
set /p x="请选择一个要操作的卷(1-!n!,默认输入0退出):_"
echo ----------------------------------------
if !x!==0 goto :eof
for %%c in (!x!) do (
    if defined vol%%c (
      for /f"tokens=1,2,3 delims= " %%x in ('echo !vol%%c!') do (
            echo ------------------------------------
            echo 你选择了 %%x
            echo 对应盘符 %%y
            echo 对应卷是 %%z
            echo ------------------------------------
            rem 以下内容对卷进行 盘符装卸操作
            if /i "%%y"=="%systemdrive%" (
                echo 系统所在卷,盘符不可更改。
                pause
                goto :end1
            )            
            set ltr_x=
            set /p ltr_x="请输入一个新盘符(输入0卸载该卷盘符):_"
            if !ltr_x!==0 (
                if not "%%y"=="*:" (
                  mountvol %%y\ /d
                ) else (
                  echo 没有盘符,不需要卸载.
                  pause
                )
            ) else (
                set find=0
                for %%r in (!ltr0!) do (
                  if /i "%%r"=="!ltr_x!" (set "find=1")
                )
                if !find!==1 (
                  if not "%%y"=="*:" (mountvol %%y\ /d)
                  mountvol !ltr_x!:\ %%z
                ) else (
                  echo 盘符输入错误,不是空闲盘符。
                  pause
                )
            )
      )
    ) else (
      echo 输入错误,重新来过.
      pause
    )
)
:end1
goto :main



dos时代菜鸟 发表于 2022-7-11 19:16:39

aichong168 发表于 2022-7-10 15:48
我一般用系统自带的磁盘管理功能区修改

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

dos时代菜鸟 发表于 2022-7-11 19:15:32

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

python 习惯了

481416322 发表于 2022-7-11 17:30:12

dos时代菜鸟 发表于 2022-7-11 10:01
仅供参考

看了半天才知道谁是真正的楼主

linqyx 发表于 2022-7-11 17:17:53

dos时代菜鸟 发表于 2022-7-11 10:01
仅供参考

不仅学习了知识,写批处理的格式也学习了。以前看到的批处理基本都是从每行行首开始,不知怎么缩进。现在感觉以前写出来的东西都乱糟糟的。

linqyx 发表于 2022-7-11 16:50:25

dos时代菜鸟 发表于 2022-7-11 10:01
仅供参考

谢谢,学习了。

dos时代菜鸟 发表于 2022-7-11 10:01:47

本帖最后由 dos时代菜鸟 于 2022-7-11 19:32 编辑

仅供参考

@echo off
setlocal enabledelayedexpansion
title MOUNTVOL 盘符装卸脚本
:main
cls
echo MOUNTVOL 盘符装卸脚本
echo 序号--盘符-----卷-------------------------------------------------
set n=0
set ltr_s=
for /f "delims=" %%c in ('mountvol /l') do (
    set str1=%%c
    rem 对字符串去空格处理
    set str1=!str1: =!
   
    if defined m ( rem 如果定义了 变量m 说明上一条字符串 是一个卷内容,且本行字符串 是该卷对应的盘符
      if "!str1:~1,1!"==":" ( rem 如果本行字符串第二个字符是 : 说明 是一个有效的盘符
            set ltr=!str1:~0,2!
                rem 把 盘符存入 变量 ltr_s 中
            set "ltr_s=!ltr_s! !str1:~0,1!"
      ) else (
            set "ltr=*:"
      )
      echo !m:~-2!.    !ltr!      !vol!
      rem 设置包含序号的 vol 变量内容,如 vol1 vol2 vol3 vol4 .......
      set vol!n!=!m:~-2!.   !ltr!   !vol!
      set m=
      set vol=
    )
    if "!str1:~0,1!"=="\" (rem 如果本行字符串第一个字符 是 \ 说明是 个卷,把改行信息出入 vol 变量并设置 m 变量
      set /a n=!n!+1
      set m= !n!
      set vol=!str1!
    )
)
echo ----------------------------------------
echo 已占用盘符!ltr_s!
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
for %%c in (!ltr_s!) DO (set ltr0=!ltr0: %%c=!)
echo 空闲盘符   !ltr0!
echo ----------------------------------------
set x=0
set /p x="请选择一个要操作的卷(1-!n!,默认输入0退出):_"
echo ----------------------------------------
if !x!==0 goto :eof
for %%c in (!x!) do (
    if defined vol%%c (
      for /f"tokens=1,2* delims= " %%x in ('echo !vol%%c!') do (
            echo ------------------------------------
            echo 你选择了 %%x
            echo 对应盘符 %%y
            echo 对应卷是 %%z
            echo ------------------------------------
            rem 以下内容对卷进行 盘符装卸操作
            if /i "%%y"=="%systemdrive%" (
                echo 系统所在卷,盘符不可更改。
                pause
                goto :end1
            )            
            set ltr_x=
            set /p ltr_x="请输入一个新盘符(输入0卸载该卷盘符):_"
            if !ltr_x!==0 (
                if not "%%y"=="*:" (
                  mountvol %%y\ /d
                ) else (
                  echo 没有盘符,不需要卸载.
                  pause
                )
            ) else (
                set find=0
                for %%r in (!ltr0!) do (
                  if /i "%%r"=="!ltr_x!" (set "find=1")
                )
                if !find!==1 (
                  if not "%%y"=="*:" (mountvol %%y\ /d)
                  mountvol !ltr_x!:\ %%z
                ) else (
                  echo 盘符输入错误,不是空闲盘符。
                  pause
                )
            )
      )
    ) else (
      echo 输入错误,重新来过.
      pause
    )
)
:end1
goto :main





dos时代菜鸟 发表于 2022-7-11 08:12:44

linqyx 发表于 2022-7-11 01:02
@echo off
mode con cols=40 lines=20
setlocal enabledelayedexpansion


仅供参考

@echo off
setlocal enabledelayedexpansion
:main
cls
echo -------卷列表----------
set n=0
set ltr_s=
for /f "delims=" %%c in ('mountvol') do (
    set str1=%%c
      rem 对字符串去空格处理
    set str1=!str1: =!
   
    if defined m ( rem 如果定义了 变量m 说明上一条字符串 是一个卷内容,且本行字符串 是该卷对应的盘符
      if "!str1:~1,1!"==":" ( rem 如果本行字符串第二个字符是 : 说明 是一个有效的盘符
            set ltr=!str1:~0,2!
                rem 把 盘符存入 变量 ltr_s 中
            set "ltr_s=!ltr_s! !str1:~0,2!"
      ) else (
            set ltr=
      )
      echo !m:~-2!.   !vol!   !ltr!
            rem 设置包含序号的 vol 变量内容,如 vol1 vol2 vol3 vol4 .......
      set vol!n!=!m:~-2!.   !vol!   !ltr!
      set m=
      set vol=
    )
    if "!str1:~0,1!"=="\" (rem 如果本行字符串第一个字符 是 \ 说明是 个卷,把改行信息出入 vol 变量并设置 m 变量
      set /a n=!n!+1
      set m= !n!
      set vol=!str1!
    )
)
echo 已占用盘符:!ltr_s!
set /p x="请选择一个要操作的卷:(1-!n!,输入0退出)"
if !x!==0 goto :eof
for %%c in (!x!) do (
    if defined vol%%c (
      for /f"tokens=1,2* delims= " %%x in ('echo !vol%%c!') do (
            echo ------------------------------------
            echo 你选择了 %%x
            echo 对应卷是 %%y
            echo 对应盘符 "%%z"
            echo ------------------------------------
      )
    ) else (
      echo 输入错误,重新来过!
    )
)
pause
goto :main

linqyx 发表于 2022-7-11 01:02:30

本帖最后由 linqyx 于 2022-7-11 01:34 编辑

dos时代菜鸟 发表于 2022-7-10 20:16
慢慢来,不着急,

其实,用 mountvol 可以获取 卷列表和 盘符列表,你给 卷 做个编号,让用户选择 需 ...
@echo off
mode con cols=40 lines=20
setlocal enabledelayedexpansion
for /f "tokens=4 delims=. " %%i in ('ver') do set ver=%%i
if !ver! equ 5goto :vol1
if !ver! gtr 5goto :vol2
:vol1
for /f "skip=12 delims=" %%i in ('mountvol') do (echo %%i>>vol.txt)
goto :main
:vol2
for /f "skip=21 delims=" %%i in ('mountvol') do (echo %%i>>vol.txt)
goto :main
:main
for %%i in (c: d: e: f: g: h: i: j: k: l: m: n: o: p: q: r: s: t: u: v: w: x: y: z:) do echo %%i>>zm.txt
echo 请耐心等待,为您分配盘符即将完成
for /f %%i in (zm.txt) do (
for /f %%j in (vol.txt) do (
      mountvol %%i %%j >nul 2>nul
      )
    )
del /f /q vol.txt
del /f /q zm.txt
这个没有判断分区是否已经有盘符语句,执行比较慢。可以给xp win7 win10无盘符分区分配盘符,有无其他bug未知。等以后学习更多批处理知识后再来改进。

dos时代菜鸟 发表于 2022-7-10 20:16:56

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

慢慢来,不着急,

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

linqyx 发表于 2022-7-10 18:40:23

dos时代菜鸟 发表于 2022-7-10 11:17
建议:
1.通过 mountvol 或者其他命令 获取已存在的 盘符列表 并显示出来
2.通过 已存在的 盘符列表 判断 ...

pushd 命令可以判断输入的盘符是否已经存在。
我刚学习批处理不久,3.通常我们更需要 把 没有分配盘符的卷 给分配个盘符 对我来说,比较难。

aichong168 发表于 2022-7-10 15:48:53

我一般用系统自带的磁盘管理功能区修改

dos时代菜鸟 发表于 2022-7-10 11:17:08

建议:
1.通过 mountvol 或者其他命令 获取已存在的 盘符列表 并显示出来
2.通过 已存在的 盘符列表 判断用户 输入是否正确
3.通常我们更需要 把 没有分配盘符的卷 给分配个盘符
页: [1] 2
查看完整版本: 更改分区盘符的批处理