标题: [文本处理] 如何获取GPT磁盘分区的数目并替换掉指定文本中的内容? [打印本页]
作者: 电动小马达 时间: 2016-3-19 00:02 标题: 如何获取GPT磁盘分区的数目并替换掉指定文本中的内容?
本帖最后由 电动小马达 于 2016-3-22 23:52 编辑
有一点复杂,大神慢慢看
在文件夹中存在3个文件“reslut.txt”“diskpart.ini”“id.ini”
------------------以下为result.txt的内容--------------------- 磁盘 ### 状态 大小 可用 Dyn Gpt
- -------- ------------- ------- ------- --- ---
- 磁盘 0 联机 40 GB 0 B *
- 磁盘 1 联机 14 GB 0 B
-
-
- 磁盘 0 现在是所选磁盘。
-
- 分区 ### 类型 大小 偏移量
- ------------- ---------------- ------- -------
- 分区 1 主要 36 GB 20 KB
- 分区 2 主要 6571 MB 37 GB
-
-
- 磁盘 1 现在是所选磁盘。
-
- 分区 ### 类型 大小 偏移量
- ------------- ---------------- ------- -------
- 分区 1 主要 14 GB 128 KB
复制代码
------------------以上为reslut.txt文件内容------------------
--------------------以下为diskpart.ini文件的内容---------------- list disk
- sel disk 9
- list part
- sel part 9
- shrink desired =1500
- CREATE PAR PRIMARY SIZE=1024
- format quick fs=ntfs label="LENOVO_PART"
- assign letter="M“
- CREATE PAR PRIMARY
- format quick fs=fat32 label="LRS_ESP"
- assign letter="N“
复制代码
--------------------以上为diskpart.ini文件的内容---------------
--------------------以下为id.ini文件的内容---------------- LIST DISK
- SEL DISK 9
- LIST PART
- SEL PART 8
- Set id="BFBFAFE7-A34F-448A-9A5B-6213EB736C22"
- gpt attributes=0x8000000000000001
- SEL PART 7
- remove
- Set id="de94bba4-06d1-4d40-a16a-bfd50179d6ac"
- gpt attributes=0x8000000000000001
- EXIT
复制代码
--------------------以上为id.ini文件的内容---------------
我有这么个设想
在result.txt的某一行有一个星号(有星号的称为GPT磁盘),我想用cmd判断出哪个磁盘是GPT磁盘(即最后有星号)并且得到这个磁盘最后一个分区的编号,比如这个文件中的磁盘0分区2。
如果只有一个磁盘是GPT磁盘那么继续进行“接下来的操作”,如果有两个或者两个以上的磁盘是GPT磁盘那么就询问用户哪个是你要选择的磁盘,让用户自己选择0还是1还是2等等
如果没有星号,则echo 无GPT磁盘 之后退出CMD
接下来的操作:
根据磁盘编号0,将这个0替换掉diskpart.ini中第2行的数字9
将这个0替换掉id.ini第2行的数字9
根据分区编号2,将diskpart.ini的第四行末尾的9替换为2
将id.ini第四行的8替换为4 (规律是N+2)
将id.ini第七行的7替换为3 (规律是N+1)
------------------------------------------------------------------------------
总结一下:
对于上面三个文件我想做的事情是
判断出带星号的磁盘编号和这个磁盘的最后一个分区编号
如果有一个磁盘有星号就进行“接下来的操作”,如果有两个或者以上的磁盘就让用户自己输入磁盘编号,然后进行“接下来的操作”
--------------------------------------------------------------------------------------
流程图如下
http://pan.baidu.com/s/1c0UGgi0
作者: bailong360 时间: 2016-3-19 10:37
本帖最后由 bailong360 于 2016-3-19 13:09 编辑
result.txt的格式就不能好看点吗- 1>1/* :
- @echo off
- setlocal enabledelayedexpansion
- for /f "tokens=2" %%i in ('findstr "\*" result.txt^|^|echo no') do (
- if "%%i"=="no" (
- echo 无GPT磁盘
- pause>nul
- exit
- )
- set /a n+=1,choice=%%i
- set GPT=!GPT!,%%i
- )
- if %n% gtr 1 set /p choice=请选择一个磁盘(%GPT:~1%?):
- cscript -nologo -e:jscript "%~f0" "%choice%"
- exit
- */
- var FSO = new ActiveXObject('Scripting.FileSystemObject');
- var Argu = WScript.arguments;
- var Disk = Argu.item(0);
- var DiskReg = new RegExp('磁盘 ' + Disk + ' 现在(.|[\\r\\n])*磁盘 ' + (Disk * 1 + 1), '');
- var zone = FSO.OpenTextFile('result.txt', 1).ReadAll().match(DiskReg)[0].match(/\d+(?= 主要)/g);
- var ZoneNum = zone[zone.length - 1];
-
- Edit('diskpart.ini', 2, 9, Disk);
- Edit('diskpart.ini', 4, 9, ZoneNum);
- Edit('id.ini', 2, 9, Disk);
- Edit('id.ini', 4, 8, ZoneNum * 1 + 2);
- Edit('id.ini', 7, 7, ZoneNum * 1 + 1);
-
- function Edit(FileName, Line, Old, New) {
- var NewFile = '';
- var file = FSO.OpenTextFile(FileName, 1);
- var LineCount = 0;
- while (!file.AtEndOfStream) {
- var str = file.ReadLine();
- if (++LineCount == Line) {
- str = str.replace(Old, New);
- }
- NewFile = NewFile + str + '\r\n';
- }
- file.Close();
- file = FSO.OpenTextFile(FileName, 2);
- file.Write(NewFile);
- file.Close();
- }
复制代码
作者: 电动小马达 时间: 2016-3-19 14:53
回复 2# bailong360
感谢大神的回复,我想知道第一行1>1/* :有什么作用呢
作者: codegay 时间: 2016-3-19 14:58
回复 2# bailong360
result.txt 的内容应该是diskpart命令输出的.
作者: happy886rr 时间: 2016-3-19 15:04
本帖最后由 happy886rr 于 2016-3-19 22:56 编辑
回复 1# 电动小马达 我也来一个- @echo off&setlocal enabledelayedexpansion&title
- mode con cols=37 lines=26
- echo ┌───────────────┐
- echo 丨### GPT磁盘列表 ###丨
- echo 丨 丨
- for /f "tokens= 2" %%a in ('type result.txt^|findstr "磁盘.*[0-9].*联机.*\*"') do (
- set /a i+=1 &set "#!i!=%%a" &echo 丨 GPT磁盘编号:%%a 丨
- )
- echo └───────────────┘
- if "!i!"=="" (echo 无GPT磁盘 &pause>nul &exit)
- if "!i!"=="1" (set "dp=!#1!") else (
- echo ----------------------------------
- set /p cho=选择磁盘号:
- set "dp=!cho!"
- )
- for /f "tokens=1,2,3" %%a in ('type result.txt') do (
- if !gk! equ 1 (
- if "%%c"=="主要" (
- set "fx=1"
- ) else (
- if !fx! equ 1 (goto main)
- )
- )
- set "str=%%b %%c"
- if "!str!"=="%dp% 现在是所选磁盘。" (set "gk=1" &set "fx=0")
- set mark=%%b
- )
- :main
- set /a m=1!mark! 2>nul||echo GPT磁盘!dp! 无分区 &&pause>nul &&exit
- (for /f "delims=" %%a in ('type diskpart.ini') do (
- set gk=1
- set "str=%%a"
- if /i "!str:~0,8!"=="SEL DISK" (set gk=0 &echo sel disk !dp!)
- if /i "!str:~0,8!"=="SEL PART" (set gk=0 &echo sel part !mark!)
- if !gk! equ 1 (echo !str!)
- ))>diskpart2.ini
- del diskpart.ini
- ren diskpart2.ini diskpart.ini
- (for /f "tokens=1* delims=:" %%a in ('type id.ini^|findstr /n .*') do (
- set gk=1
- if %%a equ 2 (set gk=0 &echo SEL DISK !dp!)
- if %%a equ 4 (set gk=0 &set /a mark1=mark+2 &echo SEL PART !mark1!)
- if %%a equ 7 (set gk=0 &set /a mark2=mark+1 &echo SEL PART !mark2!)
- if !gk! equ 1 (echo %%b)
- ))>id2.ini
- del id.ini
- ren id2.ini id.ini
- echo 已选择磁盘:!dp!,分区!mark!
- echo ----------------------------------
- echo 修改DISKPART.INI参数为:
- echo sel disk !dp!
- echo sel part !mark!
- echo 修改ID.INI参数为:
- echo SEL PART !mark1!
- echo SEL PART !mark2!
- echo ----------------------------------
- echo 执行完毕!
- pause>nul
复制代码
作者: 电动小马达 时间: 2016-3-19 15:14
本帖最后由 电动小马达 于 2016-3-19 15:15 编辑
回复 5# happy886rr
貌似有一些问题,我得到的结果是这样的
diskpart.ini- list disk
- sel disk 0
- list part
- sel part
- shrink desired =1500
- CREATE PAR PRIMARY SIZE=1024
- format quick fs=ntfs label="LENOVO_PART"
- assign letter="M“
- CREATE PAR PRIMARY
- format quick fs=fat32 label="LRS_ESP"
- assign letter="N“
复制代码
id.ini- LIST DISK
- SEL DISK 0
- LIST PART
- SEL PART 2
- Set id="BFBFAFE7-A34F-448A-9A5B-6213EB736C22"
- gpt attributes=0x8000000000000001
- SEL PART 1
- remove
- Set id="de94bba4-06d1-4d40-a16a-bfd50179d6ac"
- gpt attributes=0x8000000000000001
- EXIT
复制代码
正确结果应该是
diskpart.ini- list disk
- sel disk 0
- list part
- sel part 2
- shrink desired =1500
- CREATE PAR PRIMARY SIZE=1024
- format quick fs=ntfs label="LENOVO_PART"
- assign letter="M“
- CREATE PAR PRIMARY
- format quick fs=fat32 label="LRS_ESP"
- assign letter="N“
复制代码
id.ini- LIST DISK
- SEL DISK 0
- LIST PART
- SEL PART 4
- Set id="BFBFAFE7-A34F-448A-9A5B-6213EB736C22"
- gpt attributes=0x8000000000000001
- SEL PART 3
- remove
- Set id="de94bba4-06d1-4d40-a16a-bfd50179d6ac"
- gpt attributes=0x8000000000000001
- EXIT
复制代码
作者: bailong360 时间: 2016-3-19 17:25
回复 3# 电动小马达
http://bbs.bathome.net/thread-33125-1-1.html
作者: 电动小马达 时间: 2016-3-19 18:16
回复 7# happy886rr
感谢你的回复,不过还是有一些问题,比如
1.如果result.txt的内容是这样- 磁盘 ### 状态 大小 可用 Dyn Gpt
- -------- ------------- ------- ------- --- ---
- 磁盘 0 联机 40 GB 0 B *
- 磁盘 1 联机 14 GB 0 B *
-
-
- 磁盘 0 现在是所选磁盘。
-
- 分区 ### 类型 大小 偏移量
- ------------- ---------------- ------- -------
- 分区 1 主要 36 GB 20 KB
- 分区 2 主要 6571 MB 37 GB
-
-
- 磁盘 1 现在是所选磁盘。
-
- 分区 ### 类型 大小 偏移量
- ------------- ---------------- ------- -------
- 分区 1 主要 14 GB 128 KB
复制代码
即我有两个GPT磁盘,运行这个CMD会显示“检测到可用的GPT磁盘编号:0”而不是显示0和1
2.如果只有一个是GPT磁盘- 磁盘 ### 状态 大小 可用 Dyn Gpt
- -------- ------------- ------- ------- --- ---
- 磁盘 0 联机 40 GB 0 B *
- 磁盘 1 联机 14 GB 0 B
-
-
- 磁盘 0 现在是所选磁盘。
-
- 分区 ### 类型 大小 偏移量
- ------------- ---------------- ------- -------
- 分区 1 主要 36 GB 20 KB
- 分区 2 主要 6571 MB 37 GB
-
-
- 磁盘 1 现在是所选磁盘。
-
- 分区 ### 类型 大小 偏移量
- ------------- ---------------- ------- -------
- 分区 1 主要 14 GB 128 KB
复制代码
依然会提示我选择GPT磁盘编号,我想这种情况能不能直接让程序自动执行而不需要我输入那个编号。
作者: happy886rr 时间: 2016-3-19 18:27
回复 9# 电动小马达
这个容易。我发现你的result文件里的*号后边有个空格,我的正则匹配的是*结尾的,所以匹配不到空格结尾,已经修正匹配模式,不再严格匹配末端。
已修改,还是原来的楼层.
作者: 电动小马达 时间: 2016-3-19 18:40
回复 9# happy886rr
太感谢你了,修改了这么多次。十分感谢
作者: 电动小马达 时间: 2016-3-19 18:52
回复 9# happy886rr
其实目的已经达到了,谢谢层主,就是有点强迫症
比如result.txt如果是这样的情况- 磁盘 ### 状态 大小 可用 Dyn Gpt
- -------- ------------- ------- ------- --- ---
- 磁盘 0 联机 40 GB 0 B *
- 磁盘 1 联机 14 GB 0 B
-
-
- 磁盘 0 现在是所选磁盘。
-
- 分区 ### 类型 大小 偏移量
- ------------- ---------------- ------- -------
- 分区 1 主要 36 GB 20 KB
- 分区 2 主要 6571 MB 37 GB
- 分区 3 主要 40 GB 77 GB
- 分区 4 OEM 6000 MB 83 GB
-
-
- 磁盘 1 现在是所选磁盘。
-
- 分区 ### 类型 大小 偏移量
- ------------- ---------------- ------- -------
- 分区 1 主要 14 GB 128 KB
复制代码
比如这个磁盘0的分区,最后一个是OEM,前面三个是主要,我想获取最大的 “主要分区编号“3而不是”最大分区编号“4,如果是这种情况该如何修改呢,麻烦大神给个意见。(新开一个楼层即可,不用修改原来的楼层)
拜托了
作者: 电动小马达 时间: 2016-3-19 20:11
回复 12# happy886rr
大神,还是有一些问题。
在最大的主分区是2的时候,替换完的数据应该是- list disk
- sel disk 0
- list part
- sel part 2
- shrink desired =1500
- CREATE PAR PRIMARY SIZE=1024
- format quick fs=ntfs label="LENOVO_PART"
- assign letter="M“
- CREATE PAR PRIMARY
- format quick fs=fat32 label="LRS_ESP"
- assign letter="N“
-
- LIST DISK
- SEL DISK 0
- LIST PART
- SEL PART 4
- Set id="BFBFAFE7-A34F-448A-9A5B-6213EB736C22"
- gpt attributes=0x8000000000000001
- SEL PART 3
- remove
- Set id="de94bba4-06d1-4d40-a16a-bfd50179d6ac"
- gpt attributes=0x8000000000000001
- EXIT
复制代码
但实际上生成的是- list disk
- sel disk 0
- list part
- sel part 1
- shrink desired =1500
- CREATE PAR PRIMARY SIZE=1024
- format quick fs=ntfs label="LENOVO_PART"
- assign letter="M“
- CREATE PAR PRIMARY
- format quick fs=fat32 label="LRS_ESP"
- assign letter="N“
-
- LIST DISK
- SEL DISK 0
- LIST PART
- SEL PART 3
- Set id="BFBFAFE7-A34F-448A-9A5B-6213EB736C22"
- gpt attributes=0x8000000000000001
- SEL PART 2
- remove
- Set id="de94bba4-06d1-4d40-a16a-bfd50179d6ac"
- gpt attributes=0x8000000000000001
- EXIT
复制代码
而且因为这个reslut.txt是根据diskpart命令生成的,可能上传到这里的代码与原来的格式有点差别,所以我把result.txt,id.ini,diskpart.ini打包到一起,供大神测试一下
上传的文件转换完成后,最终的的正确形式是
diskpart.ini为0,4
di.ini为0,6,5
作者: happy886rr 时间: 2016-3-19 23:02
回复 12# 电动小马达
已经修改完毕,还是原楼层。加入显示界面。
作者: 电动小马达 时间: 2016-3-20 00:57
回复 13# happy886rr
您太厉害了,非常感谢!!
作者: 电动小马达 时间: 2016-3-22 23:50
本帖最后由 电动小马达 于 2016-3-22 23:52 编辑
回复 13# happy886rr
大神,上一次我有一个表达的错误,就是说id.ini要替换的两个数字
我原来说是所在磁盘的最大主分区数+2和最大主分区数+1
现在要改为所在磁盘的最大分区数+2和最大分区数+1
比如result.txt是这个内容的时候- 磁盘 ### 状态 大小 可用 Dyn Gpt
- -------- ------------- ------- ------- --- ---
- 磁盘 0 联机 119 GB 0 B *
- 磁盘 1 联机 931 GB 0 B
-
- 磁盘 0 现在是所选磁盘。
-
- 分区 ### 类型 大小 偏移量
- ------------- ---------------- ------- -------
- 分区 1 系统 300 MB 1024 KB
- 分区 2 保留 128 MB 301 MB
- 分区 3 主要 75 GB 429 MB
- 分区 4 主要 42 GB 75 GB
- 分区 5 恢复 800 MB 118 GB
- 分区 6 OEM 201 MB 119 GB
复制代码
id.ini最后的内容应该是8和7而不是6和5- LIST DISK
- SEL DISK 0
- LIST PART
- SEL PART 8
- Set id="BFBFAFE7-A34F-448A-9A5B-6213EB736C22"
- gpt attributes=0x8000000000000001
- SEL PART 7
- remove
- Set id="de94bba4-06d1-4d40-a16a-bfd50179d6ac"
- gpt attributes=0x8000000000000001
- EXIT
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |