无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 3447|回复: 36
打印 上一主题 下一主题

[已解决] NSIS 语法随机变量diskpart判别U盘号,请教各位?

[复制链接]
跳转到指定楼层
1#
发表于 2024-5-13 16:16:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 chen463 于 2024-5-28 11:57 编辑

NSIS 语法随机变量diskpart判别U盘号,请教各位?给建议或提供相关程序代码

我是个初学者,只是好学习,望各位指导感谢‧
网络上搜索很多,太高阶的看不懂使用,太浅的达不到所需求‧

现在构想有两种方式:
A.        把U.txt字符READ 3 WRITE写入\DISK.txt字符 5替换5-3执行。
B.        在程序中把变量$R8=3 去修改WRITE写入\DISK.txt内容:5-3

自己想把现有固定条件,变成随机变量的方式
1.随机获取U.txt内容:3
2.自动执行DISK.txt内容:
List disk
Sel disk 5


U盘号已经设定为$R8=3已经确认,现在只需要把U.txt字符READ 3 WRITE写入\DISK.txt里面字符5替换成3,获取随机变量0.1.2.3.4.5…,就能自动执行 diskpart 脚本diskpart /s scriptname.txt,首要先确立select disk [0.1.2.3.4.5]为先。必须把获取的3写入5位置替换,获取随机变量。
范例;DISK.txt[脚本现在设定为select disk 5而获取随机变量U盘实际为3]

select disk 5
clean
convert gpt
create partition primary size=300
format quick fs=ntfs label="Windows RE tools"
assign letter="T"
create partition efi size=100
rem == Note: for Advanced Format Generation One drives, change to size=260.

format quick fs=fat32 label="System"
assign letter="S"
create partition msr size=128
create partition primary
format quick fs=ntfs label="Windows"
assign letter="W"


点评

赞  发表于 2024-6-12 10:18
用心了  发表于 2024-5-20 17:49

评分

参与人数 1无忧币 +2 收起 理由
yyz2191958 + 2 赞一个!

查看全部评分

2#
发表于 2024-5-13 16:53:26 | 只看该作者
看不懂  帮顶
回复

使用道具 举报

3#
发表于 2024-5-14 08:40:33 | 只看该作者
帮顶,等大神解惑。。。
回复

使用道具 举报

4#
发表于 2024-5-14 08:54:34 来自手机 | 只看该作者
语文学的不好,看不明白
回复

使用道具 举报

5#
发表于 2024-5-14 13:02:13 | 只看该作者
看不懂 插个眼 等大神解答
回复

使用道具 举报

6#
发表于 2024-5-15 09:16:22 | 只看该作者
不是很懂
回复

使用道具 举报

7#
发表于 2024-5-16 22:03:02 | 只看该作者
顶一下, 让大佬看见
回复

使用道具 举报

8#
发表于 2024-5-17 11:11:50 来自手机 | 只看该作者
换个思路,直接重新生成整个diskpart脚本不就好了。
回复

使用道具 举报

9#
发表于 2024-5-18 13:41:31 | 只看该作者
支持一个。
回复

使用道具 举报

10#
发表于 2024-5-18 20:35:43 | 只看该作者
本帖最后由 hilsonma 于 2024-5-18 20:53 编辑

不知楼主是如何获取u盘号,所以这一步就略过。如果u.txt的内容就是正确的u盘号的话,批可以如下:
  1. @echo off
  2. setlocal EnableDelayedExpansion
  3. for /f %%a in (u.txt) do set d=%%a
  4. (
  5. echo select disk !d!
  6. echo clean
  7. echo convert gpt
  8. echo sel par 1
  9. echo del par override
  10. echo create partition efi size=260
  11. echo format fs=fat32 label=System quick
  12. echo assign letter=S
  13. echo create partition msr size=16
  14. echo create partition primary
  15. echo shr minimum=300
  16. echo format fs=ntfs label=Windows quick
  17. echo assign letter=W
  18. echo create partition primary
  19. echo format fs=ntfs label="Windows RE tools" quick
  20. echo assign letter=T
  21. echo set id=de94bba4-06d1-4d40-a16a-bfd50179d6ac
  22. echo gpt attributes=0x8000000000000001
  23. echo lis par
  24. )|diskpart.exe
复制代码


脚本会清空U盘的!!! 应该在脚本执行前有提示
以上脚本已按ms示例将工具分区调整到最后并赋与专门属性,esp直接使用260MB,如需更大请修改。
转换gpt时会自动产生msr分区,以上脚本已添加清除此分区。

点评

这批处理是想让我执行CMD吗?不知diskpart可行否? 如果可行,可透过批处理来输出\TXT让diskpart完成脚本执行。 U盘,外可从FBINST,BOOTICE来获取,也可从程序代码选取U盘来确认  详情 回复 发表于 2024-5-19 10:26
回复

使用道具 举报

11#
发表于 2024-5-18 23:48:18 | 只看该作者
本帖最后由 dos时代菜鸟 于 2024-5-19 00:27 编辑

如果有 多个u盘,就麻烦了。
另外 diskpart 本身 也能找到u盘

  1. @echo off
  2. SETLOCAL ENABLEDELAYEDEXPANSION
  3. set "diskpart_cmd=echo list disk"
  4. set disks=
  5. for /f "tokens=2" %%c in ('^(!diskpart_cmd!^)^|diskpart') do (
  6.     if defined disks set "disks=!disks!,%%c"
  7.     if "%%c"=="-------------" set "disks=,"
  8. )
  9. set diskpart_cmd=echo rem
  10. for  %%c in (!disks!) do (
  11.     set "diskpart_cmd=!diskpart_cmd! ^& echo select disk %%c ^& echo detail disk"
  12. )
  13. set usb_s=
  14. for /f "tokens=1,2,3 delims=: " %%c in ('^(!diskpart_cmd!^)^|diskpart') do (
  15.     if "%%c%%e"=="磁盘现在是所选磁盘。" set "diskx=%%d"
  16.     if "%%c"=="类型" (
  17.         if /I "%%d"=="USB" ( SET usb_s=!usb_s!,!diskx!)
  18.         set diskx=
  19.     )
  20. )
  21. echo.
  22. if not defined usb_s ( echo 没有U盘...) else (
  23.     for %%c in (!usb_s!) do (
  24.         echo 找到U盘 编号:%%c
  25.     )
  26. )
  27. echo.
  28. echo.
  29. pause
复制代码



点评

请教大大,拜读您几个范例,才启发这次'尝试,diskpart可有搜寻detail DISK等讯息输出\TXT功能代码,  详情 回复 发表于 2024-5-19 10:08
回复

使用道具 举报

12#
发表于 2024-5-19 00:47:50 | 只看该作者
楼主作为一名论坛前辈,发帖这么多天,高手解答的寥寥无几,难道是论坛缺少高手?非也!发求助帖应使用言简意赅、清晰易懂的语言表达,你的贴子显然不符合这种条件。

发帖示例
如何使用NSIS获取diskpart的优盘编号并修改diskpart脚本?

1. 如何用NSIS获取diskpart的优盘编号?用于操作优盘。
2. 获取编号后如何替换现有diskpart脚本的内容,比如下面的select disk 3中的3替换成5。

select disk 3
clean
convert gpt
……



回复

使用道具 举报

13#
发表于 2024-5-19 00:49:40 | 只看该作者
  1.     ; 仅适用于select disk位于第一行的情况
  2.     StrCpy $R1 "select disk "
  3.     StrLen $R2 "$R1"
  4.     SetOutPath "$EXEDIR"
  5.     FileOpen $R0 'sample.txt' a
  6.     FileRead $R0 $0
  7.     DetailPrint '更改前:$0'
  8.     FileSeek $R0 $R2
  9.     FileWrite $R0 "5  "
  10.     FileSeek $R0 0
  11.     FileRead $R0 $0
  12.     DetailPrint '更改后:$0'
  13.     FileClose $R0   
复制代码


  1. !include "TextFunc.nsh"

  2. Section
  3.     ; 适用于select disk不在第一行,和多行的情况,会更改每一行select disk
  4.     ${LineFind} "sample.txt" "" "" "func_edit"
  5. SectionEnd

  6. Function func_edit
  7.     ${TrimNewLines} "$R9" $9
  8.     StrCpy $9 "$9" 12
  9.     ${If} $9 == 'select disk '
  10.         StrCpy $R9 "select disk 5$\r$\n"
  11.     ${EndIf}

  12.     Push $1
  13. FunctionEnd
复制代码


点评

请教大大,这几个例应可以运用上,试试,程度差,语法得研究一下  详情 回复 发表于 2024-5-19 10:13
回复

使用道具 举报

14#
 楼主| 发表于 2024-5-19 10:07:53 | 只看该作者
感谢几位前辈大大指导,后学慢慢研究一下学习运用,感谢。

因为diskpart脚本执行是一串几行的,我没能力从NSIS语法去做变量设定,其实要修改的有很多处.
磁盘选择setect disk 1.2.3.4.5……
分区大小size=100.200.300…..
分区选择setect part 1.2.3.4.5……
能力不足,只能先求U盘确认无误,其他固定脚本。
回复

使用道具 举报

15#
 楼主| 发表于 2024-5-19 10:08:40 | 只看该作者
本帖最后由 chen463 于 2024-5-19 10:28 编辑
dos时代菜鸟 发表于 2024-5-18 23:48
如果有 多个u盘,就麻烦了。
另外 diskpart 本身 也能找到u盘

感谢大大,拜读您几个范例,才启发这次'尝试,diskpart可有搜寻detail DISK等讯息输出\TXT功能代码,

点评

可以的 直接 > x.txt 不就行了?  详情 回复 发表于 2024-5-19 12:12
回复

使用道具 举报

16#
 楼主| 发表于 2024-5-19 10:13:47 | 只看该作者

大大,这几个例应可以运用上,试试,程度差,语法得研究一下
回复

使用道具 举报

17#
 楼主| 发表于 2024-5-19 10:26:29 | 只看该作者
hilsonma 发表于 2024-5-18 20:35
不知楼主是如何获取u盘号,所以这一步就略过。如果u.txt的内容就是正确的u盘号的话,批可以如下:

这批处理是想让我执行CMD吗?不知diskpart可行否?
如果可行,可透过批处理来输出\TXT让diskpart完成脚本执行。

U盘,外可从FBINST,BOOTICE来获取,也可从程序代码选取U盘来确认
回复

使用道具 举报

18#
发表于 2024-5-19 12:12:04 | 只看该作者
本帖最后由 dos时代菜鸟 于 2024-5-19 12:13 编辑
chen463 发表于 2024-5-19 10:08
感谢大大,拜读您几个范例,才启发这次'尝试,diskpart可有搜寻detail DISK等讯息输出\TXT功能代码,

可以的
直接  
> x.txt
不就行了?

其实不用生成文件,直接cmd 调用变量 就行。
关键是 你能确定 就 1个 u盘么?


点评

哈哈,多个U盘的确有这现象,其实已经被clear了一个外挂硬盘,才发现diskpart不能乱使,左右都插入U盘在测试着,看着list DISK没问题,结果不小心频繁变换配备插拔,干掉一个位在不是SEL DISK显示的外挂硬盘上,可能  详情 回复 发表于 2024-5-19 17:06
回复

使用道具 举报

19#
 楼主| 发表于 2024-5-19 17:06:28 | 只看该作者
dos时代菜鸟 发表于 2024-5-19 12:12
可以的
直接  
> x.txt

哈哈,多个U盘的确有这现象,其实已经被clear了一个外挂硬盘,才发现diskpart不能乱使,左右都插入U盘在测试着,看着list DISK没问题,结果不小心频繁变换配备插拔,干掉一个位在不是SEL DISK显示的外挂硬盘上,可能是给的条件不充足,就失败执行。还好自己找回分区表恢复数据。
两个纯U盘操作OK,其实排序会随插入时间、配备不同而上下2-3变化,但是如果是外挂USB硬盘,系统会排除而显示在硬盘,但是意外总会发生,外挂USB硬盘会误判辨别为U盘的,所以才想变量所选项的U盘号,以保万无一失。

批次可能无法预知所选的U盘号[没操作过],但是程式可以立判所选的U盘号

点评

我 12楼代码能找到 多个u盘 ,但仅限简体中文。  详情 回复 发表于 2024-5-19 20:38
回复

使用道具 举报

20#
发表于 2024-5-19 20:38:44 | 只看该作者
chen463 发表于 2024-5-19 17:06
哈哈,多个U盘的确有这现象,其实已经被clear了一个外挂硬盘,才发现diskpart不能乱使,左右都插入U盘在 ...

我 12楼代码能找到 多个u盘 ,但仅限简体中文。
回复

使用道具 举报

21#
发表于 2024-5-19 23:18:43 | 只看该作者
本帖最后由 nttwqz 于 2024-5-19 23:31 编辑
  1. @echo off
  2. setlocal  enabledelayedexpansion
  3. set title=优盘分区工具
  4. title %title%
  5. ::自动请求以管理员权限运行
  6. 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" 2>nul && exit /b & del "%temp%\getadmin.vbs" /f /q>nul
  7. pushd %~dp0

  8. call dpinfo.bat

  9. :: 如果要合并成一个脚本,请将下面内容复制到dpinfo文件 :: 开始脚本定制 的后面
  10. set title=优盘分区工具
  11. for %%a in (!dkl!) do if /i "!dk_%%a_type!"=="USB" if defined usbdkl (set usbdkl=!usbdkl! %%a) else set usbdkl=%%a

  12. if not defined usbdkl (
  13.         color 4f
  14.         echo;错误,没有找到USB磁盘!
  15.         pause
  16.         exit
  17. )

  18. title %title% - 选择优盘
  19. echo;
  20. echo;  #  大小      名称
  21. echo;  -  --------  -------------------------------------------
  22. for %%a in (!usbdkl!) do (
  23.         echo;  %%a  !dk_%%a_size_echo!  !dk_%%a_name!
  24. )
  25. echo;
  26. set /p udisk=请选择优盘:
  27. echo;
  28. title %title% - 选择分区
  29. if defined udisk (
  30.         echo;  分区        VOL  LTR  !dk_type_title_echo!  隐藏  ACT ESP  大小      可用      偏移量    !dk_label_title_echo!  FS/ID
  31.         echo;  ----        ---  ---  !dk_type_fgx!  ----  --- ---  --------  --------  --------  !dk_label_fgx!  ------------------
  32.         for %%a in (!udisk!) do (
  33.                 for %%b in (!dk_%%a_dpl!) do (
  34.                         echo;   %%b        !dk_%%a_%%b_vol_echo!  !dk_%%a_%%b_ltr_echo!  !dk_%%a_%%b_type_echo!  !dk_%%a_%%b_hidden_echo!  !dk_%%a_%%b_act_echo!  !dk_%%a_%%b_size_echo!  !dk_%%a_%%b_free_echo!  !dk_%%a_%%b_offset_echo!  !dk_%%a_%%b_label_echo!  !dk_%%a_%%b_fs!
  35.                 )
  36.                
  37.         )
  38. )
  39. echo;
  40. set /p upart=请选择分区:
  41. echo;
  42. echo;
  43. title %title%
  44. pause
  45. exit
复制代码


dpinfo.bat需要放到同目录下,其它路径自己修改call

其实,傲梅分区助手命令行版更合适做为优盘分区工具,支持无损调整分区等diskpart无法实现的操作。

usb.7z

16.85 KB, 下载次数: 8

点评

感谢您建议分区助手,昨晚研究了一下命令行用法,作者很有心,里面提供很多范例,也手动测试UD多分区试用,觉得非常满意,建立分区速度快准确度高,不比diskpart脚本差,甚至更亲切人性操作,了解使用逻辑后更顺手操  详情 回复 发表于 2024-6-12 08:43
去官方下载了分区助手9.13命令行U盘专用版可以用了,感谢!有问题再来请教  详情 回复 发表于 2024-6-11 21:21
接受您的建议,diskpart已经玩过完成,现在尝试分区助手,竟然您建议,表示您熟悉这软件,所以请教您,为何CMD运行PartAssist.exe出现找不到ScanPartition.dll而失败,我已经放入同目录中。  详情 回复 发表于 2024-6-11 19:48
回复

使用道具 举报

22#
发表于 2024-5-19 23:52:09 | 只看该作者
本帖最后由 dos时代菜鸟 于 2024-5-20 19:02 编辑

唉,给你个现成的算了。 找出 usb 盘 让你自己选择,然后直接分区。

  1. @echo off
  2. SETLOCAL ENABLEDELAYEDEXPANSION
  3. echo 正在获取 usb_disk 信息 ......
  4. set "diskpart_cmd=echo rescan ^& echo list disk"
  5. set disks=
  6. for /f "delims=" %%x in ('^(!diskpart_cmd!^)^|diskpart') do (
  7.     for /f "tokens=2" %%c in ("%%x") do (
  8.         if defined disks (
  9.             set disk%%c=%%x
  10.             set "disks=!disks!,%%c"
  11.         )
  12.         if "%%c"=="-------------" set "disks=,"
  13.     )
  14. )
  15. set diskpart_cmd=echo rem
  16. for  %%c in (!disks!) do (
  17.     set "diskpart_cmd=!diskpart_cmd! ^& echo select disk %%c ^& echo detail disk"
  18. )
  19. set usb_s=
  20. set usb_n=0
  21. for /f "tokens=1,2,3 delims=: " %%c in ('^(!diskpart_cmd!^)^|diskpart') do (
  22.     if "%%c%%e"=="磁盘现在是所选磁盘。" set "diskx=%%d"
  23.     if "%%c"=="类型" (
  24.         if /I "%%d"=="USB" (
  25.             set /a usb_n+=1
  26.             SET "usb_s=!usb_s! !diskx!"
  27.         )
  28.         set diskx=
  29.     )
  30. )
  31. if  !usb_n! equ 0  (
  32.     echo 没有U盘...
  33.     goto :end1
  34. )
  35. :select1
  36.     cls
  37.     echo.
  38.     echo 部署 usb_disk ...
  39.     echo.
  40.     echo USB盘列表:
  41.     echo ---------------------------------------------------------------------
  42.     for %%c in (!usb_s!) do (echo !disk%%c!)
  43.     echo ---------------------------------------------------------------------
  44.     if !usb_n! geq 2 (
  45.         set /p disk_U=请选择一个U盘(!usb_s! , X退出):
  46.         if /i "!disk_U!"=="X" goto :end1
  47.         set find1=0
  48.         for %%c in (!usb_s!) do (
  49.             if  !disk_U! equ %%c set find1=1
  50.         )
  51.         if !find1! equ 0 (
  52.             echo 选择错误,请按任意键重新来过....
  53.             pause>nul
  54.             goto :select1
  55.         )
  56.     )else (
  57.         set /a disk_u=!usb_s!
  58.         SET /P X=按任意键开始对唯一的 U 盘进行部署(X退出)....
  59.         if /i "!x!"=="x" goto :end1
  60.     )
  61.     echo.
  62.     echo.
  63.     echo 对 USB_disk #!disk_U! 进行分区部署:
  64.     call :fdisk1 !disk_U!
  65. :end1
  66.     pause
  67.     goto :eof
  68. :fdisk1
  69.     echo 请稍等......
  70.     (
  71.         echo select disk %1
  72.         echo clean
  73.         echo convert gpt

  74.         echo create partition efi size=100
  75.         echo format quick fs=fat32 label="System"
  76.         echo create partition msr size=128

  77.         echo create partition primary size=300
  78.         echo format quick fs=ntfs label="Windows RE tools"
  79.         echo assign letter="T"

  80.         echo create partition primary
  81.         echo format quick fs=ntfs label="Windows"
  82.         echo assign letter="W"
  83.     )|diskpart >nul 2>nul
  84.     echo 完毕...
  85. exit /b


复制代码




回复

使用道具 举报

23#
 楼主| 发表于 2024-5-21 09:48:19 | 只看该作者
感谢几位前辈大大,无私地教学示范范例,diskpart脚本已经初步成形,变量U盘号已由程序代码设定,经各位的传球助攻已经进球得分,最后完成当初规画的B.方案,由程序代码变量符号$R8设定修改脚本文本,非常感谢!感恩!

傲梅分区助手命令行,改天再来学习之。先前没使用过。初步变量U盘号制作已达成。

脚本要制作U盘UD三分区或U盘UD四分区或纯UEFI单、双、三、四分区,就由脚本变量去决定,批次后学不懂,后学四十几岁才刚接触计算器,开始学习,而且怀疑开始患了老年痴呆症状,几年没看的程序代码,自己亲自编程的竟然看不懂,热忱已退,记忆已失,哈哈…最后再一次感谢各位感恩大家。
回复

使用道具 举报

24#
 楼主| 发表于 2024-6-11 19:48:42 | 只看该作者
nttwqz 发表于 2024-5-19 23:18
dpinfo.bat需要放到同目录下,其它路径自己修改call

其实,傲梅分区助手命令行版更合适做为优盘分区 ...

接受您的建议,diskpart已经玩过完成,现在尝试分区助手,竟然您建议,表示您熟悉这软件,所以请教您,为何CMD运行PartAssist.exe出现找不到ScanPartition.dll而失败,我已经放入同目录中。
回复

使用道具 举报

25#
 楼主| 发表于 2024-6-11 21:21:52 | 只看该作者
nttwqz 发表于 2024-5-19 23:18
dpinfo.bat需要放到同目录下,其它路径自己修改call

其实,傲梅分区助手命令行版更合适做为优盘分区 ...

去官方下载了分区助手9.13命令行U盘专用版可以用了,感谢!有问题再来请教
回复

使用道具 举报

26#
 楼主| 发表于 2024-6-12 08:43:31 | 只看该作者
nttwqz 发表于 2024-5-19 23:18
dpinfo.bat需要放到同目录下,其它路径自己修改call

其实,傲梅分区助手命令行版更合适做为优盘分区 ...

感谢您建议分区助手,昨晚研究了一下命令行用法,作者很有心,里面提供很多范例,也手动测试UD多分区试用,觉得非常满意,建立分区速度快准确度高,不比diskpart脚本差,甚至更亲切人性操作,了解使用逻辑后更顺手操作它,因为是系统外部软件,在PE下操作应该更能磨合建立分区成功,感谢您。

点评

因为分区助手命令行版本身就是为此而生,好像也是本坛提出的建议,作者采纳增加了该功能,作者在本坛也有账号。本坛有不少使用分区助手的工具,我倒是没用过其开发过什么工具  详情 回复 发表于 2024-6-12 10:01
回复

使用道具 举报

27#
发表于 2024-6-12 10:01:44 来自手机 | 只看该作者
chen463 发表于 2024-6-12 08:43
感谢您建议分区助手,昨晚研究了一下命令行用法,作者很有心,里面提供很多范例,也手动测试UD多分区试用 ...

因为分区助手命令行版本身就是为此而生,好像也是本坛提出的建议,作者采纳增加了该功能,作者在本坛也有账号。本坛有不少使用分区助手的工具,我倒是没用过其开发过什么工具
回复

使用道具 举报

28#
发表于 2024-6-14 08:23:49 | 只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

29#
发表于 2024-6-14 11:08:07 | 只看该作者
怎么样?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-11-22 05:53

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表