Board logo

标题: [文本处理] 如何获取GPT磁盘分区的数目并替换掉指定文本中的内容? [打印本页]

作者: 电动小马达    时间: 2016-3-19 00:02     标题: 如何获取GPT磁盘分区的数目并替换掉指定文本中的内容?

本帖最后由 电动小马达 于 2016-3-22 23:52 编辑

有一点复杂,大神慢慢看
在文件夹中存在3个文件“reslut.txt”“diskpart.ini”“id.ini”
------------------以下为result.txt的内容--------------------
  1.   磁盘 ###  状态           大小     可用     Dyn  Gpt
  2.   --------  -------------  -------  -------  ---  ---
  3.   磁盘 0    联机               40 GB      0 B        *
  4.   磁盘 1    联机               14 GB      0 B         
  5. 磁盘 0 现在是所选磁盘。
  6.   分区 ###       类型              大小     偏移量
  7.   -------------  ----------------  -------  -------
  8.   分区      1    主要                  36 GB    20 KB
  9.   分区      2    主要                6571 MB    37 GB
  10. 磁盘 1 现在是所选磁盘。
  11.   分区 ###       类型              大小     偏移量
  12.   -------------  ----------------  -------  -------
  13.   分区      1    主要                  14 GB   128 KB
复制代码
------------------以上为reslut.txt文件内容------------------

--------------------以下为diskpart.ini文件的内容---------------
  1. list disk
  2. sel disk 9
  3. list part
  4. sel part 9
  5. shrink desired =1500
  6. CREATE PAR PRIMARY SIZE=1024
  7. format quick fs=ntfs label="LENOVO_PART"
  8. assign letter="M“
  9. CREATE PAR PRIMARY
  10. format quick fs=fat32 label="LRS_ESP"
  11. assign letter="N“
复制代码
--------------------以上为diskpart.ini文件的内容---------------

--------------------以下为id.ini文件的内容---------------
  1. LIST DISK
  2. SEL DISK 9
  3. LIST PART
  4. SEL PART 8
  5. Set id="BFBFAFE7-A34F-448A-9A5B-6213EB736C22"
  6. gpt attributes=0x8000000000000001
  7. SEL PART 7
  8. remove
  9. Set id="de94bba4-06d1-4d40-a16a-bfd50179d6ac"
  10. gpt attributes=0x8000000000000001
  11. 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>1/* :
  2. @echo off
  3. setlocal enabledelayedexpansion
  4. for /f "tokens=2" %%i in ('findstr "\*" result.txt^|^|echo no') do (
  5.     if "%%i"=="no" (
  6.         echo 无GPT磁盘
  7.         pause>nul
  8.         exit
  9.     )
  10.     set /a n+=1,choice=%%i
  11.     set GPT=!GPT!,%%i
  12. )
  13. if %n% gtr 1 set /p choice=请选择一个磁盘(%GPT:~1%?):
  14. cscript -nologo -e:jscript "%~f0" "%choice%"
  15. exit
  16. */
  17. var FSO  = new ActiveXObject('Scripting.FileSystemObject');
  18. var Argu = WScript.arguments;
  19. var Disk = Argu.item(0);
  20. var DiskReg = new RegExp('磁盘 ' + Disk + ' 现在(.|[\\r\\n])*磁盘 ' + (Disk * 1 + 1), '');
  21. var zone    = FSO.OpenTextFile('result.txt', 1).ReadAll().match(DiskReg)[0].match(/\d+(?=    主要)/g);
  22. var ZoneNum = zone[zone.length - 1];
  23. Edit('diskpart.ini', 2, 9, Disk);
  24. Edit('diskpart.ini', 4, 9, ZoneNum);
  25. Edit('id.ini', 2, 9, Disk);
  26. Edit('id.ini', 4, 8, ZoneNum * 1 + 2);
  27. Edit('id.ini', 7, 7, ZoneNum * 1 + 1);
  28. function Edit(FileName, Line, Old, New) {
  29.     var NewFile = '';
  30.     var file = FSO.OpenTextFile(FileName, 1);
  31.     var LineCount = 0;
  32.     while (!file.AtEndOfStream) {
  33.         var str = file.ReadLine();
  34.         if (++LineCount == Line) {
  35.             str = str.replace(Old, New);
  36.         }
  37.         NewFile = NewFile + str + '\r\n';
  38.     }
  39.     file.Close();
  40.     file = FSO.OpenTextFile(FileName, 2);
  41.     file.Write(NewFile);
  42.     file.Close();
  43. }
复制代码

作者: 电动小马达    时间: 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# 电动小马达 我也来一个
  1. @echo off&setlocal enabledelayedexpansion&title
  2. mode con cols=37 lines=26
  3. echo  ┌───────────────┐
  4. echo  丨###       GPT磁盘列表      ###丨
  5. echo  丨                              丨
  6. for /f "tokens= 2" %%a in ('type result.txt^|findstr "磁盘.*[0-9].*联机.*\*"') do (
  7. set /a i+=1 &set "#!i!=%%a" &echo  丨    GPT磁盘编号:%%a             丨
  8. )
  9. echo  └───────────────┘
  10. if "!i!"=="" (echo 无GPT磁盘 &pause>nul &exit)
  11. if "!i!"=="1" (set "dp=!#1!") else (
  12. echo ----------------------------------
  13. set /p cho=选择磁盘号:
  14. set "dp=!cho!"
  15. )
  16. for /f "tokens=1,2,3" %%a in ('type result.txt') do (
  17. if !gk! equ 1 (
  18. if "%%c"=="主要" (
  19. set "fx=1"
  20. ) else (
  21. if !fx! equ 1 (goto main)
  22. )
  23. )
  24. set "str=%%b %%c"
  25. if "!str!"=="%dp% 现在是所选磁盘。" (set "gk=1" &set "fx=0")
  26. set mark=%%b
  27. )
  28. :main
  29. set /a m=1!mark! 2>nul||echo GPT磁盘!dp! 无分区 &&pause>nul &&exit
  30. (for /f "delims=" %%a in ('type diskpart.ini') do (
  31. set gk=1
  32. set "str=%%a"
  33. if /i "!str:~0,8!"=="SEL DISK" (set gk=0 &echo sel disk !dp!)
  34. if /i "!str:~0,8!"=="SEL PART" (set gk=0 &echo sel part !mark!)
  35. if !gk! equ 1 (echo !str!)
  36. ))>diskpart2.ini
  37. del diskpart.ini
  38. ren diskpart2.ini diskpart.ini
  39. (for /f "tokens=1* delims=:" %%a in ('type id.ini^|findstr /n .*') do (
  40. set gk=1
  41. if %%a equ 2 (set gk=0 &echo SEL DISK !dp!)
  42. if %%a equ 4 (set gk=0 &set /a mark1=mark+2 &echo SEL PART !mark1!)
  43. if %%a equ 7 (set gk=0 &set /a mark2=mark+1 &echo SEL PART !mark2!)
  44. if !gk! equ 1 (echo %%b)
  45. ))>id2.ini
  46. del id.ini
  47. ren id2.ini id.ini
  48. echo 已选择磁盘:!dp!,分区!mark!
  49. echo ----------------------------------
  50. echo 修改DISKPART.INI参数为:
  51. echo             sel disk !dp!
  52. echo             sel part !mark!
  53. echo 修改ID.INI参数为:
  54. echo             SEL PART !mark1!
  55. echo             SEL PART !mark2!
  56. echo ----------------------------------
  57. echo 执行完毕!
  58. pause>nul
复制代码

作者: 电动小马达    时间: 2016-3-19 15:14

本帖最后由 电动小马达 于 2016-3-19 15:15 编辑

回复 5# happy886rr

貌似有一些问题,我得到的结果是这样的
diskpart.ini
  1. list disk
  2. sel disk 0
  3. list part
  4. sel part
  5. shrink desired =1500
  6. CREATE PAR PRIMARY SIZE=1024
  7. format quick fs=ntfs label="LENOVO_PART"
  8. assign letter="M“
  9. CREATE PAR PRIMARY
  10. format quick fs=fat32 label="LRS_ESP"
  11. assign letter="N“
复制代码
id.ini
  1. LIST DISK
  2. SEL DISK 0
  3. LIST PART
  4. SEL PART 2
  5. Set id="BFBFAFE7-A34F-448A-9A5B-6213EB736C22"
  6. gpt attributes=0x8000000000000001
  7. SEL PART 1
  8. remove
  9. Set id="de94bba4-06d1-4d40-a16a-bfd50179d6ac"
  10. gpt attributes=0x8000000000000001
  11. EXIT
复制代码
正确结果应该是
diskpart.ini
  1. list disk
  2. sel disk 0
  3. list part
  4. sel part 2
  5. shrink desired =1500
  6. CREATE PAR PRIMARY SIZE=1024
  7. format quick fs=ntfs label="LENOVO_PART"
  8. assign letter="M“
  9. CREATE PAR PRIMARY
  10. format quick fs=fat32 label="LRS_ESP"
  11. assign letter="N“
复制代码
id.ini
  1. LIST DISK
  2. SEL DISK 0
  3. LIST PART
  4. SEL PART 4
  5. Set id="BFBFAFE7-A34F-448A-9A5B-6213EB736C22"
  6. gpt attributes=0x8000000000000001
  7. SEL PART 3
  8. remove
  9. Set id="de94bba4-06d1-4d40-a16a-bfd50179d6ac"
  10. gpt attributes=0x8000000000000001
  11. 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的内容是这样
  1.   磁盘 ###  状态           大小     可用     Dyn  Gpt
  2.   --------  -------------  -------  -------  ---  ---
  3.   磁盘 0    联机               40 GB      0 B        *
  4.   磁盘 1    联机               14 GB      0 B        *
  5. 磁盘 0 现在是所选磁盘。
  6.   分区 ###       类型              大小     偏移量
  7.   -------------  ----------------  -------  -------
  8.   分区      1    主要                  36 GB    20 KB
  9.   分区      2    主要                6571 MB    37 GB
  10. 磁盘 1 现在是所选磁盘。
  11.   分区 ###       类型              大小     偏移量
  12.   -------------  ----------------  -------  -------
  13.   分区      1    主要                  14 GB   128 KB
复制代码
即我有两个GPT磁盘,运行这个CMD会显示“检测到可用的GPT磁盘编号:0”而不是显示0和1

2.如果只有一个是GPT磁盘
  1.   磁盘 ###  状态           大小     可用     Dyn  Gpt
  2.   --------  -------------  -------  -------  ---  ---
  3.   磁盘 0    联机               40 GB      0 B        *
  4.   磁盘 1    联机               14 GB      0 B         
  5. 磁盘 0 现在是所选磁盘。
  6.   分区 ###       类型              大小     偏移量
  7.   -------------  ----------------  -------  -------
  8.   分区      1    主要                  36 GB    20 KB
  9.   分区      2    主要                6571 MB    37 GB
  10. 磁盘 1 现在是所选磁盘。
  11.   分区 ###       类型              大小     偏移量
  12.   -------------  ----------------  -------  -------
  13.   分区      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如果是这样的情况
  1.   磁盘 ###  状态           大小     可用     Dyn  Gpt
  2.   --------  -------------  -------  -------  ---  ---
  3.   磁盘 0    联机               40 GB      0 B        *
  4.   磁盘 1    联机               14 GB      0 B         
  5. 磁盘 0 现在是所选磁盘。
  6.   分区 ###       类型              大小     偏移量
  7.   -------------  ----------------  -------  -------
  8.   分区      1    主要                  36 GB    20 KB
  9.   分区      2    主要                6571 MB    37 GB
  10.   分区      3    主要                  40 GB    77 GB
  11.   分区      4    OEM                6000 MB    83 GB
  12. 磁盘 1 现在是所选磁盘。
  13.   分区 ###       类型              大小     偏移量
  14.   -------------  ----------------  -------  -------
  15.   分区      1    主要                  14 GB   128 KB
复制代码
比如这个磁盘0的分区,最后一个是OEM,前面三个是主要,我想获取最大的 “主要分区编号“3而不是”最大分区编号“4,如果是这种情况该如何修改呢,麻烦大神给个意见。(新开一个楼层即可,不用修改原来的楼层)
拜托了
作者: 电动小马达    时间: 2016-3-19 20:11

回复 12# happy886rr


    大神,还是有一些问题。

在最大的主分区是2的时候,替换完的数据应该是
  1. list disk
  2. sel disk 0
  3. list part
  4. sel part 2
  5. shrink desired =1500
  6. CREATE PAR PRIMARY SIZE=1024
  7. format quick fs=ntfs label="LENOVO_PART"
  8. assign letter="M“
  9. CREATE PAR PRIMARY
  10. format quick fs=fat32 label="LRS_ESP"
  11. assign letter="N“
  12. LIST DISK
  13. SEL DISK 0
  14. LIST PART
  15. SEL PART 4
  16. Set id="BFBFAFE7-A34F-448A-9A5B-6213EB736C22"
  17. gpt attributes=0x8000000000000001
  18. SEL PART 3
  19. remove
  20. Set id="de94bba4-06d1-4d40-a16a-bfd50179d6ac"
  21. gpt attributes=0x8000000000000001
  22. EXIT
复制代码
但实际上生成的是
  1. list disk
  2. sel disk 0
  3. list part
  4. sel part 1
  5. shrink desired =1500
  6. CREATE PAR PRIMARY SIZE=1024
  7. format quick fs=ntfs label="LENOVO_PART"
  8. assign letter="M“
  9. CREATE PAR PRIMARY
  10. format quick fs=fat32 label="LRS_ESP"
  11. assign letter="N“
  12. LIST DISK
  13. SEL DISK 0
  14. LIST PART
  15. SEL PART 3
  16. Set id="BFBFAFE7-A34F-448A-9A5B-6213EB736C22"
  17. gpt attributes=0x8000000000000001
  18. SEL PART 2
  19. remove
  20. Set id="de94bba4-06d1-4d40-a16a-bfd50179d6ac"
  21. gpt attributes=0x8000000000000001
  22. 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是这个内容的时候
  1.   磁盘 ###  状态           大小     可用     Dyn  Gpt
  2.   --------  -------------  -------  -------  ---  ---
  3.   磁盘 0    联机              119 GB      0 B        *
  4.   磁盘 1    联机              931 GB      0 B         
  5. 磁盘 0 现在是所选磁盘。
  6.   分区 ###       类型              大小     偏移量
  7.   -------------  ----------------  -------  -------
  8.   分区      1    系统                 300 MB  1024 KB
  9.   分区      2    保留                 128 MB   301 MB
  10.   分区      3    主要                  75 GB   429 MB
  11.   分区      4    主要                  42 GB    75 GB
  12.   分区      5    恢复                 800 MB   118 GB
  13.   分区      6    OEM                201 MB   119 GB
复制代码
id.ini最后的内容应该是8和7而不是6和5
  1. LIST DISK
  2. SEL DISK 0
  3. LIST PART
  4. SEL PART 8
  5. Set id="BFBFAFE7-A34F-448A-9A5B-6213EB736C22"
  6. gpt attributes=0x8000000000000001
  7. SEL PART 7
  8. remove
  9. Set id="de94bba4-06d1-4d40-a16a-bfd50179d6ac"
  10. gpt attributes=0x8000000000000001
  11. EXIT
复制代码





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