标题: [系统相关] 求助批处理diskpart 结果 整理合并 卡壳几天了 [打印本页]
作者: dong3626 时间: 2023-3-1 15:16 标题: 求助批处理diskpart 结果 整理合并 卡壳几天了
正在写一个自动安装系统的批处理
主要思路:
1. list disk 获取磁盘总数
2. 遍历磁盘,通过 sel disk, list part, detail disk 生成磁盘信息
3. 使用for 遍历磁盘信息,提取数据
卡壳地方:list disk 与 detail disk 命令结果合并一起
解析内容,生成硬盘分区文件 [分区序号,磁盘号,分区号,大小,文件系统, 盘符,标签]
求指教或完善,,,谢谢
搬砖来的如下:
===================================================================- @echo off
- ::自动请求以管理员权限运行
- if /i "%systemdrive%"=="C:" reg query HKU\S-1-5-20>nul 2>nul || echo;CreateObject^("Shell.Application"^).ShellExecute "%~f0", "%*", "", "runas", 1 > "%temp%\getadmin.vbs" && cscript //b "%temp%\getadmin.vbs" && exit /b & del "%temp%\getadmin.vbs" /f /q>nul
-
- SetLocal EnableDelayedExpansion
- ::设置批处理所在目录
- set DIR_CUR=%~dp0
- cd %DIR_CUR%
-
- color 02
- :: 磁盘总数,从0开始
- for /f "delims=" %%i in ('echo list disk^|diskpart^|findstr /i "联机"') do (set /a dn+=1)
- set /a DSK_NO=%dn%-1
-
-
- :: 生成磁盘信息
- if exist dp_dsk.txt del dp_dsk.txt
- for /l %%i in (0,1,!DSK_NO!) do (
- (echo sel disk %%i & echo detail disk & echo list part)|diskpart>>dp_dsk.txt
- )
-
- ::解析内容,生成硬盘分区文件 [序号,磁盘号,分区号,大小,文件系统, 盘符,标签]
- SetLocal EnableDelayedExpansion
- if exist dp_ap.txt del dp_ap.txt
- for /f "delims=" %%j in (dp_dsk.txt) do (
- set "oneline=%%j"
- ::行号
- set /a l+=1
- if "!oneline:~0,5!"=="在计算机上" (set /a n=!l!+2 & set /a t=!l!+4 & set /a p=!l!+6)
- if !l!==!n! (set nn=!oneline:~3,1!)
- if !l!==!t! (set tt=!oneline!)
- if !l!==!p! (set pp=!oneline:~7! & (echo !nn! !tt! !pp!))
- if "!oneline:~0,7!"==" 分区 " (set /a b+=1 & (echo !b! !nn! !oneline:~10,1! !oneline:~15,3! !oneline:~30,10!))
- )
-
-
- pause
复制代码
作者: newswan 时间: 2023-3-1 16:45
回复 1# dong3626
http://bbs.wuyou.net/forum.php?mod=viewthread&tid=409570
作者: dong3626 时间: 2023-3-1 18:53
本帖最后由 dong3626 于 2023-3-1 18:56 编辑
回复 dong3626
newswan 发表于 2023-3-1 16:45
发帖前看过,,,无奈 刚入门,,,实在看不明白
另外,能接触到的基本都是新电脑或近2年的,不需要考虑这么复杂的环境,
只想代码简单,逻辑清晰,解决问题 就好
谢谢
作者: newswan 时间: 2023-3-1 19:19
回复 3# dong3626
要么powershell 或者wmic
作者: went 时间: 2023-3-1 23:22
- @echo off & cd /d "%~dp0"
- setlocal enabledelayedexpansion
- REM 管理员权限
- %1 start "" mshta vbscript:createobject("shell.application").shellexecute("""%~0""","REM",,"runas",1)(window.close)&exit
-
- REM 获取磁盘总数
- set /a "DSK_NO=-1"
- for /f "delims=" %%i in ('echo list disk^|diskpart^|findstr /i "联机"') do (set /a DSK_NO+=1)
-
- REM 生成磁盘信息
- echo 序号,磁盘号,分区号,大小,文件系统,盘符,标签
- set /a "num=0"
- for /l %%z in (0,1,!DSK_NO!) do (
- for /f "skip=1 tokens=2-9" %%a in ('(echo sel disk %%z ^& echo detail disk^)^|diskpart^|findstr "卷"') do (
- if "%%h"=="" (
- echo !num!,%%z,%%a,%%d%%e,%%b,无,无
- ) else (
- echo !num!,%%z,%%a,%%f%%g,%%d,%%b,%%c
- )
- set /a "num+=1"
- )
- )
- pause&exit
复制代码
作者: Batcher 时间: 2023-3-2 09:41
回复 5# went
测试结果:- 序号,磁盘号,分区号,大小,文件系统,盘符,标签
- 0,0,1,MB正常,磁盘分区,系统保留,NTFS
- 1,0,2,GB正常,磁盘分区,C,NTFS
- 2,1,3,31GB,NTFS,E,Key
- 请按任意键继续. . .
复制代码
测试环境:- 磁盘 0 现在是所选磁盘。
- 卷 ### LTR 标签 FS 类型 大小 状态 信息
- ---------- --- ----------- ----- ---------- ------- --------- --------
- 卷 1 系统保留 NTFS 磁盘分区 100 MB 正常 系统
- 卷 2 C NTFS 磁盘分区 31 GB 正常 启动
-
- 磁盘 1 现在是所选磁盘。
-
- 卷 ### LTR 标签 FS 类型 大小 状态 信息
- ---------- --- ----------- ----- ---------- ------- --------- --------
- 卷 3 E Key NTFS 磁盘分区 31 GB 正常
复制代码
作者: Batcher 时间: 2023-3-2 09:46
回复 5# went
也许还有更加复杂的情况,标签可能为空、1个词、多个词。
作者: newswan 时间: 2023-3-2 13:26
回复 3# dong3626
使用目的是自动安装系统,那么就需要得到 详细情况,最好完备,磁盘分区格式、隐藏分区
如果pe,支持 powershell ,可以用下面的
http://www.bathome.net/thread-65340-1-1.html
作者: went 时间: 2023-3-2 16:39
回复 7# Batcher
不通用,for是有点无能为力了
作者: dong3626 时间: 2023-3-2 20:44
进度更新,卡到变量嵌套更新了- @echo off
- ::自动请求以管理员权限运行
- if /i "%systemdrive%"=="C:" reg query HKU\S-1-5-20>nul 2>nul || echo;CreateObject^("Shell.Application"^).ShellExecute "%~f0", "%*", "", "runas", 1 > "%temp%\getadmin.vbs" && cscript //b "%temp%\getadmin.vbs" && exit /b & del "%temp%\getadmin.vbs" /f /q>nul
-
- ::SetLocal EnableDelayedExpansion
- ::设置批处理所在目录
- set DIR_CUR=%~dp0
- cd %DIR_CUR%
-
- color 02
- :: 磁盘总数,从0开始
- for /f "delims=" %%i in ('echo list disk^|diskpart^|findstr /i "联机"') do (set /a dn+=1)
- set /a DSK_NO=%dn%-1
-
-
- :: 生成磁盘信息
- if exist dp_t.txt del dp_t.txt
- for /l %%i in (0,1,!DSK_NO!) do (
- (echo sel disk %%i & echo detail disk & echo list part)|diskpart>>dp_t.txt
- )
-
- ::解析内容,生成硬盘分区文件 [序号,磁盘号,分区号,大小,文件系统, 盘符,标签]
- for /f "delims=" %%j in (dp_t.txt) do (
- set "ol=%%j"
- ::行号
- set /a l+=1
- ::echo 第!l!行: !ol:~38,4!
- if "!ol:~0,5!"=="在计算机上" (set /a n=!l!+2 & set /a t=!l!+4 & set /a p=!l!+6)
- if !l!==!n! (set nn=!ol:~3,1!)
- if !l!==!t! (set tt=!ol!)
- if !l!==!p! (set pp=!ol:~7! & (echo ***** !nn! !tt! !pp! *****))
- if "!ol:~38,4!"=="磁盘分区" (
- set ttt=!ol:~50,7!
- set "ttt=!ttt: =!"
- (echo 盘符-文件系统-大小 !ol:~14,1! !ol:~31,5! !ol:~50,7!)
- (set lb!ttt!=!ttt!)
- (set PF!ttt!=!ol:~14,1!)
- (set FS!ttt!=!ol:~31,5!)
- (echo xxxxxxxxxxxxxxxxx:lb!ttt!)
- )
- SetLocal EnableDelayedExpansion
- if "!ol:~0,7!"==" 分区 " (
- set /a b+=1
- set ppp=!ol:~33,7!
- set "ppp=!ppp: =!"
- (echo !b! !nn! 盘符 文件系统 标签 !ol:~10,1! !ol:~15,3! !ppp!)
- echo PPPPPPPPPPPFFFFFFFFFF:lb!ppp!
- if defined lb!ppp! (echo 卡到这里了 lb!ppp! %PF!ppp!% %FS!ppp!%) else (echo 不可更新 lb!ppp!)
- )
- )
-
-
- echo.
- pause
复制代码
作者: Batcher 时间: 2023-3-3 09:13
回复 10# dong3626
变量嵌套
http://bbs.bathome.net/thread-2899-1-1.html
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |