nttwqz
发表于 2018-6-16 23:26:02
pznpt 发表于 2018-6-16 10:55
嗯,可能是我理解错了吧。
如果选项有1-10,那么除了1、2、3、4、5、6、7、8、9、10之外的都不合法,我需要这么判断。
dos时代菜鸟
发表于 2018-6-17 15:36:13
nttwqz 发表于 2018-6-16 23:26
如果选项有1-10,那么除了1、2、3、4、5、6、7、8、9、10之外的都不合法,我需要这么判断。
那我建议就用 for /l 对用户输入数据做 ==判断 ,不能用 数学比较大小的方法了。
nttwqz
发表于 2018-6-17 16:12:08
本帖最后由 nttwqz 于 2018-6-17 16:35 编辑
dos时代菜鸟 发表于 2018-6-17 15:36
那我建议就用 for /l 对用户输入数据做 ==判断 ,不能用 数学比较大小的方法了。
我也在考虑要不要用这种方法,毕竟这种方法一下子就把非选项中的判断出来了,而且即使字母列列表也可以用for。
今天一直在尝试提高脚本执行效率,但是却发现,分析结果其实过程很短,一般在1ms以内,但是diskpart执行脚本却基本在21ms左右,即使用管道和findstr也只不过多2ms左右。要是有什么方法,不用第三方软件,比如查注册表等获取实时的硬盘和分区编号(和diskpart中一样),那就可以一次diskpart获取到信息了。
dos时代菜鸟
发表于 2018-6-17 16:44:36
nttwqz 发表于 2018-6-17 16:12
我也在考虑要不要用这种方法,毕竟这种方法一下子就把非选项中的判断出来了,而且即使字母列列表也可以 ...
第三方软件,可以考虑用 分区助手,一下 信息全来了。支持 命令行。
如果不用 分区助手,用 注册表,我没试过,估计都是基于vol 的信息。或者用 vbs 也只是 到 扩展分区,扩展分区下的逻辑分区 就 都显示的 一个分区号上,而且 有的 pe 还没有 vbs . 毕竟 是要用diskpart 做事情,信息采集 如果跟 diskpart 不一致就不好弄。
dos时代菜鸟
发表于 2018-6-17 16:57:29
建议 把 vol 号 记录上,因为 有的分区 不能被 sele part 选择上,到时候 要分配盘符,就必须 sele vol 来定位它。
nttwqz
发表于 2018-6-17 18:41:56
dos时代菜鸟 发表于 2018-6-17 16:57
建议 把 vol 号 记录上,因为 有的分区 不能被 sele part 选择上,到时候 要分配盘符,就必须 sele vol 来 ...
好说,多定义一个变量而已,已简单加入。
dos时代菜鸟
发表于 2018-6-17 22:11:38
本帖最后由 dos时代菜鸟 于 2018-6-17 22:48 编辑
nttwqz 发表于 2018-6-17 18:41
好说,多定义一个变量而已,已简单加入。
突然想起一个事儿,不一定 用得到。
如果 你想在脚本中以后还用到 这个 表中的信息 ,比如截取 某个分区的 盘符 或者 vol 编号,那么 就会用到
for /f "tokens=1-n " %%x in () do ()
这样 截取 某行 第几个单词 的问题,可是你有的 字段占位 是 空格的,这样,截取单词的时候就可能 截取到别的地方去了。除非你用 精准截取 字符串 中某几个 位置的 字符的方式来获取 想要的信息。
所以 我建议你 把没有内容的 空字段内容 用一个 字符代替之,比如 . * @ 之类的。以后判断上也方便,如果 截取到的是 特定的 字符,就说明 这个字段 没有可用信息。
当然,如果以后 不需要 通过这个表 截取数据 ,或者不用 for /f 的方式截取 字段单词 的话,也就无所谓了。
还有个 想法。
如果能 确定 硬盘分区结构 是 mbr 还是 gpt 的话, 就可以 将act /esp 合一了,不用两列,gpt 结构不存在 act 的情况。另外 一个 gpt 硬盘可能 存在 多个 efi 分区。
nttwqz
发表于 2018-6-17 23:29:33
本帖最后由 nttwqz 于 2018-6-17 23:58 编辑
dos时代菜鸟 发表于 2018-6-17 22:11
突然想起一个事儿,不一定 用得到。
如果 你想在脚本中以后还用到 这个 表中的信息 ,比如截取 某个 ...
我猜,你应该没仔细看我的脚本,我的脚本功能简单,目前不足300行,不像你的已经快1000行了,还是容易看的,毕竟我这本身就没打算写成diskpart GUI,就算写成了,估计我自己都懒得用,因为有功能强大的DG和分区助手,除非迫不得已功能这两者没有。写此脚本的主要目的,是哪天万一我不想用WinntSetup了,自己写一个脚本代替,这个很明显是用来实现相关目的的,比如安装到哪个区,哪个是活动分区,多大,好有个列表能显示,所以,为esp分配盘符、设置活动分区应该会有,但是比如调整分区大小、GPT MBR互转是绝对不会有的,只要是不影响系统安装的应该不会加入。
不知道你的意思是不是,如果以后需要列表中某个信息,还需要再次分析这个列表,然后提取?弄个占位符好提取,是这样吗?
我这个表中的信息都是由变量组成,各种磁盘分区等信息都被定义成了变量,可以任意调用。
脚本中的常用变量解释:
!dkl! 磁盘编号列表(与diskpart相同)
!dk-磁盘编号-dpl! 各磁盘分区编号列表(与diskpart相同)
!dk-磁盘编号-分区编号-vol! 卷标
!dk-磁盘编号-分区编号-ltr! 盘符
!dk-磁盘编号-分区编号-type! 类型
!dk-磁盘编号-分区编号-act! 激活、ESP
!dk-磁盘编号-分区编号-size! 大小
!dk-磁盘编号-分区编号-id! 文件系统、ID(后来已改成!dk-磁盘编号-分区编号-fs!
以后加其它信息的话,一般这样表示
!dk-磁盘编号-分区编号-该信息的常见英文!,一般取自diskpart
比如,偏移量就是!dk-磁盘编号-分区编号-offsize!(目前没有)
比如:
!dk-1-2-size!,,代表编号为0的磁盘,分区编号为2的分区的大小
!dkl!,如果有两个磁盘,diskpart列表磁盘显示0、1,那么值就是0 1
!dk-0-dpl!,磁盘0的分区列表,diskpart列表分区如果显示1、2、3、4,那么值就是1 2 3 4
有了磁盘编号列表和各磁盘分区编号列表,各种变量可以任意调用。
ACT ESP本身就是一列,不是两列!为了更直观显示中间加了个空格,ESP时!dk-磁盘编号-分区编号-act!的值有好几个空格,好让*显示在ESP下面,这样看起来像是两列,但是更容易区分ESP分区了,这样一般人都能看出来这个是GPT磁盘。
dos时代菜鸟
发表于 2018-6-18 07:04:41
nttwqz 发表于 2018-6-17 23:29
我猜,你应该没仔细看我的脚本,我的脚本功能简单,目前不足300行,不像你的已经快1000行了,还是 ...
明白了
dos时代菜鸟
发表于 2018-6-18 07:33:53
nttwqz 发表于 2018-6-17 23:29
我猜,你应该没仔细看我的脚本,我的脚本功能简单,目前不足300行,不像你的已经快1000行了,还是 ...
你也可以用@表示act.用 星豆 表示esp啊,这样就不用考虑要用空格错位显示了呀。
nttwqz
发表于 2018-6-18 07:53:42
dos时代菜鸟 发表于 2018-6-18 07:33
你也可以用@表示act.用 星豆 表示esp啊,这样就不用考虑要用空格错位显示了呀。
目前并没有发现错位问题 因为我用了tab键,我倒是觉得你那后面显示不明了,但是你那信息显示太多,对其估计显示不下
tegl
发表于 2018-6-18 08:57:58
支持原创,感谢分享~
dos时代菜鸟
发表于 2018-6-18 11:38:31
nttwqz 发表于 2018-6-18 07:53
目前并没有发现错位问题 因为我用了tab键,我倒是觉得你那后面显示不明了,但是你那信息显示太多,对其估 ...
好吧好吧,呵呵,我那个,就不考虑了,信息量多了,能看出来就行了.
nttwqz
发表于 2018-6-18 22:25:33
2.2发布,有时间精力的同志,请帮忙测试列表信息是否有错。
窄口牛
发表于 2018-6-19 07:05:22
nttwqz
发表于 2018-6-19 07:18:12
本帖最后由 nttwqz 于 2018-6-19 07:26 编辑
窄口牛 发表于 2018-6-19 07:05
2.1是否正常?
能否编辑2.2的脚本,按里面说的方法上传文件呢?多谢!
也就是
反馈Bug请管理员cmd内执行diskpart /s "%temp%\dkdet.tmp">"%temp%\dkpdet.tmp",然后,截图结果并打包上传 "%temp%\dkdet.tmp";"%temp%\dkpdet.tmp"
窄口牛
发表于 2018-6-19 08:50:29
chiannet
发表于 2018-6-19 09:04:15
作为练CMD很不错。
但就本文主题要实现的目标来说,显然PECMD 2012实现起来简便得多。
nttwqz
发表于 2018-6-19 09:46:14
窄口牛 发表于 2018-6-19 08:50
多谢,我找了台试了一下,已发现问题
编辑脚本,搜索skip=6替换成skip=5试一下
nttwqz
发表于 2018-6-19 10:07:45
chiannet 发表于 2018-6-19 09:04
作为练CMD很不错。
但就本文主题要实现的目标来说,显然PECMD 2012实现起来简便得多。
本来就是写着练手玩的,哈哈
一般的电脑没有pecmd,正常电脑上无法使用,而且我更愿意去学一门编程语言自己写程序,如果真出此类工具的话,不太喜欢使用pecmd,更何况,关键是我也不会。。。与其研究pecmd,还不如研究编程
窄口牛
发表于 2018-6-19 10:42:45
可以了,就是这个问题
nttwqz
发表于 2018-6-19 10:47:39
本帖最后由 nttwqz 于 2018-6-19 10:49 编辑
窄口牛 发表于 2018-6-19 10:42
可以了,就是这个问题
多谢!
8.1的diskpart和7不一样,以后尽量会做各个环境下测试一下再发布
chiannet
发表于 2018-6-19 11:15:24
本帖最后由 chiannet 于 2018-6-19 11:25 编辑
nttwqz 发表于 2018-6-19 10:07
本来就是写着练手玩的,哈哈
一般的电脑没有pecmd,正常电脑上无法使用,而且我更愿意去学一门编程语 ...
PART list volume ,VarName
ENVI #I=5
ENVI #J=2
ENVI #k=3
LOOP #%I%<10000,
{
MSTR 分区类型=<%I%>%VarName%
FIND $%分区类型%=,EXIT LOOP
MSTR 设备号=<%J%>%VarName%
MSTR 分区号=<%k%>%VarName%
CALC #I=%I%+7
CALC #J=%J%+7
CALC #k=%k%+7
FIND [$%分区类型%=C12A7328-F81F-11D2-BA4B-00A0C93EC93B $%分区类型%=239],
{
PART -DEVID LIST DISK %设备号%,DEVID0V2V
MSTR 容量=<2>%DEVID0V2V%
MSTR 总线=<9>%DEVID0V2V%
MSTR 分区类型=<10>%DEVID0V2V%
MSTR 设备名称=<12>%DEVID0V2V%
MESS 找到的EFI分区有\n\n\n设备名称:%设备名称%\n\n总 线:%总线%\n\n容 量:%容量%\n\n设备号__分区号:%设备号%__%分区号%\n\n分区类型:%分区类型%-EFI
}
}
nttwqz
发表于 2018-6-19 14:35:20
chiannet 发表于 2018-6-19 11:15
PART list volume ,VarName
ENVI #I=5
ENVI #J=2
多谢指教,够简单!
nttwqz
发表于 2018-6-19 15:27:27
本帖最后由 nttwqz 于 2018-6-19 15:28 编辑
窄口牛 发表于 2018-6-19 08:50
什么时候有空了能不能执行下2.21然后请管理员cmd内执行diskpart /s "%temp%\dkdet.tmp">"%temp%\dkpdet.tmp",你上次2.2里面的没这个文件,我想看一下你那2:4为什么显示ID而不是文件系统
dkpdet.tmp
freesoft00
发表于 2018-6-20 04:04:51
列表有点小问题。
我的E盘分区而没有格式化。在列表中没有显示盘符,下面有你的和菜鸟的界面对比。
NUM HD:P VOL LTR 类型 ACT ESP 大小 FS/ID
--- ---- --- --- ------- --- --- ------- ------------------
1 0:1 1 C 主要 * 29 GB NTFS
2 0:2 2 D 主要 22 GB NTFS
3 0:3 3 主要 8000 MB RAW
请选择(NUM):
MS DiskPart 分区管理 Ver:X9.12.7 ZH_CN
---------------------------------------------------------------------------------------------------------
Num Vol HD.P_ LTR FS/ID Offset Free Size Act Label RW P.Type_V.Stat_Info_type/HD.Sta_Dyn_name....
1 ---0 --- ----- ------ 0B 60GB MBR ------------ -- 联机_BAS_.
2 10.1 CNTFS1024KB 19GB 29GB*系统保留 RW 主要_正常_系统_磁盘分区.
3 20.2 DNTFS 29GB 22GB 22GB. RW 主要_正常_._磁盘分区.
4 30.3 ERAW 52GB 8000MB 8000MB. RW 主要_正常_._磁盘分区.
---------------------------------------------------------------------------------------------------------
窄口牛
发表于 2018-6-20 08:02:36
本帖最后由 窄口牛 于 2018-6-20 08:08 编辑
能显示了,2:4是ext4格式,我的有我心ext2fsd,没安装这个并且有ext分区的可能也不显示分区格式。
另外一个没有ext2fsd的系统下
nttwqz
发表于 2018-6-20 08:07:48
freesoft00 发表于 2018-6-20 04:04
列表有点小问题。
我的E盘分区而没有格式化。在列表中没有显示盘符,下面有你的和菜鸟的界面对比。
NUM ...
简单修改下,应该管用了,但是如果磁盘未分区,比如VHD,不初始化,什么都不会显示,以后改了
原因在于以前使用 if exist C:\判断是否有盘符,其实是能访问的盘符,现在用cd c:(没有\)来显示盘符,未格式化也能显示。
nttwqz
发表于 2018-6-20 08:11:24
窄口牛 发表于 2018-6-20 08:02
能显示了,2:4是ext4格式,我的有我心ext2fsd,没安装这个并且有ext分区的可能也不显示分区格式。
我说呢,我那ID应该没有EXT4这么准确的一项才对,我在想要不要把ext2fsd集成到PE里面。。。
窄口牛
发表于 2018-6-20 08:57:08
pe里有必要,可以省下linuxlive。