无忧启动论坛

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

[em]e152[/em][em]e117[/em][em]e7002[/em][em]e121[/em]

  [复制链接]
跳转到指定楼层
1#
发表于 2014-3-26 22:48:34 来自手机 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 懒得勤快 于 2014-7-10 12:25 编辑

老夫聊发少年狂,治肾亏,不含糖。锦帽貂裘,千骑用康王。为报倾城随太守,三百年,九芝堂。酒酣胸胆尚开张,西瓜霜,喜之郎。持节云中,三金葡萄糖。会挽雕弓如满月,西北望,阿迪王。
推荐
 楼主| 发表于 2014-4-4 13:33:11 来自手机 | 只看该作者
zhao 发表于 2014-4-3 18:12
太好了,前几天想弄个这样的批处理,但是不会用for /f "delims={,} tokens=2" %%a in ('bcdedit %bcddir% - ...

好吧,我再试试,之前试了不行
回复

使用道具 举报

推荐
发表于 2014-4-3 18:12:30 | 只看该作者
太好了,前几天想弄个这样的批处理,但是不会用for /f "delims={,} tokens=2" %%a in ('bcdedit %bcddir% -create /d "Windows PE版" -application osloader  ') do set w30id={%%a} 这样的命令,没办法自动获取上一句命令返回的guid。
这下学会了,

上面的 第一句bcdedit /createstore %bcddrv%\boot\bcd出错,我把他删除了。

%bcddrv%、%bcddir% 估计是为了更复杂的编程环境使用的,我的机器没这些变量。把%bcddrv%换成c:,把%bcddir%删除,可以了。

bcdedit /create {ramdiskoptions}
bcdedit /set {ramdiskoptions} ramdisksdidevice partition=C:
bcdedit /set {ramdiskoptions} ramdisksdipath \boot\boot.sdi

for /f "delims={,} tokens=2" %%a in ('bcdedit -create /d "boot Windows PE" /application osloader') do set w30id={%%a}

bcdedit -set %w30id% device ramdisk="[C:]\boot\boot.wim,{ramdiskoptions}"
bcdedit -set %w30id% osdevice ramdisk="[C:]\boot\boot.wim,{ramdiskoptions}"
bcdedit -set %w30id% path \windows\system32\boot\winload.exe
bcdedit -set %w30id% locale zh-CN
bcdedit -set %w30id% systemroot \windows
bcdedit -set %w30id% detecthal yes
bcdedit -set %w30id% winpe yes
bcdedit -displayorder %w30id% -addlast

bcdedit /timeout 2

点评

好吧,我再试试,之前试了不行  详情 回复 发表于 2014-4-4 13:33
回复

使用道具 举报

推荐
 楼主| 发表于 2014-4-2 12:41:41 来自手机 | 只看该作者
lcy163 发表于 2014-3-31 08:48
bcdedit /createstore %bcddrv%\boot\bcd

bcdedit %bcddir% /create {ramdiskoptions} /d "Windows PE版 ...

试试你的代码
回复

使用道具 举报

推荐
发表于 2014-3-31 08:48:29 | 只看该作者
bcdedit /createstore %bcddrv%\boot\bcd

bcdedit %bcddir% /create {ramdiskoptions} /d "Windows PE版"
bcdedit %bcddir% /set {ramdiskoptions} ramdisksdidevice partition=%bcddrv%
bcdedit %bcddir% /set {ramdiskoptions} ramdisksdipath \boot\boot.sdi

for /f "delims={,} tokens=2" %%a in ('bcdedit %bcddir% -create /d "Windows PE版" -application osloader  ') do set w30id={%%a}

bcdedit %bcddir% -set %w30id% device ramdisk="[%bcddrv%]\boot\boot.wim,{ramdiskoptions}"
bcdedit %bcddir% -set %w30id% osdevice ramdisk="[%bcddrv%]\boot\boot.wim,{ramdiskoptions}"
bcdedit %bcddir% -set %w30id% path \windows\system32\boot\winload.exe
bcdedit %bcddir% -set %w30id% locale zh-CN
bcdedit %bcddir% -set %w30id% inherit {bootloadersettings}
bcdedit %bcddir% -set %w30id% systemroot \windows
bcdedit %bcddir% -set %w30id% detecthal yes
bcdedit %bcddir% -set %w30id% winpe yes
bcdedit %bcddir% -set %w30id% ems yes
bcdedit %bcddir% -displayorder %w30id% -addlast

bcdedit %bcddir% /timeout 2

点评

试试你的代码  详情 回复 发表于 2014-4-2 12:41
回复

使用道具 举报

推荐
发表于 2014-4-8 22:17:54 | 只看该作者
首先,感谢兄弟针错!

1、MSR的确不能通过常规方法访问,并且我的帖子中关于MSR说法明显有误。帖子中所有MSR其实都是MBR分区中的引导分区,GPT中实现“引导”功能的就是EFI分区,自然没有歧义。
2、关于UEFI与传统BIOS,我觉得还是手工制定比较好,我自己经常做的一件事就是在UEFI启动的时候,为某分区的系统建一个传统BIOS/MBR引导项,或者大家没有碰到。
3、代码都是出自我这个半路出家的菜鸟之手,学批处理是从2011年开始的,效率较低的地方或者很傻的地方也请不吝斧正!
4、好多代码都是自己或者小范围使用,所以对措辞处理不是太严谨,MSR说法就是一例,不过帖子开头我也稍微提到一点。

5、最后说下这段代码的主要思路:
A:首先问下是否UEFI,默认是。
B:再问EFI/MBR中引导分区是否有盘符,如果没有,从z-m顺序选没有占用的分配一个,如果MBR中引导分区也是系统文件所在区,那就是有盘符了!
C:下面选择是否复制PE的 SDI和wim文件,默认复制。看上去好像多此一举,但我的办公电脑不允许双系统,连PE都不行,所以我平时把菜单删掉,但SDI和wim文件都在,就不用复制了。
D:下面如果在BIOS+MBR,选择是否复制启动环境文件,默认不复制。比如硬盘全新,我启动了PE,想把PE安装于本地磁盘,复制PE的 SDI和wim文件容易,那顺便把bootmgr和\boot\也复制进去算了。
E:下面到建菜单项,我的机子中既有微软ADK 8.1命令提示符的PE,也有WingXY Win7 X64 PE,所以那就搜索EFI/MBR中引导分区中配套的SDI和wim,通过序号确定这次操作要为哪个PE建立引导,要为不同PE建立引导,请再运行一次;我的办公电脑不允许双系统,连PE都不行,那就删菜单,但有时终究不方便,就打擦边球,建一个菜单,名字只有一个逗号“,”,检查的人不可能这么细心吧。菜单项名字指定就是这么来的,有点奇怪啊,也没办法。其实,单位里能检查我电脑的,也没几个人了!
F:bcdedit /create {bootmgr} /d "Marc Boot Manager" >nul 2>nul   bcdedit /set {bootmgr} device partition=\device\harddiskvolume!NumVolESP! >nul 2>nul是为了保险,防止原来根本就没有系统启动管理项,那建菜单都是浮云!
G:后面的都是常规得再不能常规了。
回复

使用道具 举报

推荐
发表于 2014-4-8 21:18:51 | 只看该作者
2011htpcfans 发表于 2014-4-6 12:29
将PE(Boot.sdi和*.wim)安装在EFI分区或者MBR中引导分区内,内容和选项稍多,所以更加实用!

楼主自己写的?我一时也没看完。MBR和GPT应该可以通过批处理自动识别的。另外,MSR能被访问吗?
要如何访问?据我所知,MSR分区是不能指定盘符的。
回复

使用道具 举报

10#
发表于 2014-4-6 12:29:46 | 只看该作者

将PE(Boot.sdi和*.wim)安装在EFI分区或者MBR中引导分区内,内容和选项稍多,所以更加实用!


set    bVldNum=n
set    NumVol=0
set /a a=0
set    NumSdi=1
set /a CountWim=0
set    NumWimSource=1

set    bHvFilePE=n

echo ------------------------------------------------------------------------------
echo.
echo 将PE安装在EFI分区或者MSR分区内,防止PE受损,没有这种分区你就老外了。
echo.
echo ------------------------------------------------------------------------------
echo PE放于指定盘根目录下WinPE文件夹,设备文件Boot.sdi和启动文件Boot.wim也固定。

set    bIsUEFI=y
set /p bIsUEFI=请问BIOS是否UEFI,默认是,不是请输入小写n----

set bHvLab=n
set /p bHvLab=采用MBR但无MSR,或者MBR中MSR分区/ESP分区如已有盘符,输入y,其余直接回车----
if  !bHvLab!==y (
   set /p LabelEFI=请输入ESP分区或MBR中MSR分区盘符或者MBR无MSR分区时的系统盘符----
)
if  not !bHvLab!==y (
   ::给EFI或者MSR分区分配盘符
   set bHvSetESP=n
   for %%i in (z y x w v u t s r q p o n m) do (
      if !bHvSetESP!==n ( if  not exist %%i: set LabelEFI=%%i&&set bHvSetESP=y )
   )
   echo list vol>%temp%\DiskPart.txt
   echo exit>>%temp%\DiskPart.txt
   diskpart /s %temp%\DiskPart.txt
   set /p NumVolESP=请输入GPT中ESP分区或MBR中MSR分区的卷编号,直接回车----
   echo select vol !NumVolESP!>%temp%\DiskPart.txt
   echo assign letter=!LabelEFI!>>%temp%\DiskPart.txt
   echo exit>>%temp%\DiskPart.txt
   diskpart /s %temp%\DiskPart.txt
)


::UEFI引导需要PE源盘安装硬盘PE,默认需要本PE源盘,MBR引导,默认也要
set     bCopyPE=y
set /p  bCopyPE=请问是否需要复制PE文件,默认需要,不需要输入小写n----

if not !bCopyPE!==n (

   set    name_PE=PE_MBY
   set /p name_PE=默认安装PE于!LabelEFI!:\PE_MBY目录,也可输入目录名字,如PE_WYS----

   if not exist !LabelEFI!:\!name_PE!\  md !LabelEFI!:\!name_PE!\

   set name_PathSdi=!name_PE!
   set name_PathWim=!name_PE!

   set bHvLSr=n
   for /l %%i in (1,1,5) do (
      if !bHvLSr!==n (
         set /p LPartU=请输入PE源文件所在盘盘符,可以是本地硬盘,不带冒号----
         if not exist !LPartU!: echo 这个盘符根本就没有使用了,你不要搞笑好吧
         if     exist !LPartU!: set bHvLSr=y
      )
   )
   echo.
   dir !LPartU!:\*.sdi /b /s >%temp%\fdSeek.txt
   echo 查找到!LPartU!分区下所有映像引导文件*.sdi如下表
   echo -----------------------------------------------------
   set /a a=0
   for /f "usebackq delims=" %%i in (%temp%\fdSeek.txt) do ( set /a a+=1&&echo 系统引导文件:!a! %%i)
   set /a CountWim=!a!
   if !a!==0   echo 该分区无PE系统映像引导文件,退出重来吧!&&goto End
   echo -----------------------------------------------------
   set /p NumSdi=请输入系统映像引导文件序号,我不检测无效序号,默认1----
   set bVldNSr=n
   for /l %%i in (1,1,!CountWim!) do ( if !NumSdi!==%%i set bVldNSr=y   )
   if !bVldNSr!==n echo 你没有输入有效PE系统映像文件序号,退出重来吧!&&goto End

   echo.
   dir !LPartU!:\*.wim /b /s >%temp%\fwSeek.txt
   echo 查找到!LPartU!分区下所有映像文件如下表
   echo -----------------------------------------------------
   set /a a=0
   for /f "usebackq delims=" %%i in (%temp%\fwSeek.txt) do ( set /a a+=1&&echo PE系统映像:!a! %%i)
   set /a CountWim=!a!
   if !a!==0   echo 该分区无PE系统映像文件,退出重来吧!&&goto End
   echo -----------------------------------------------------
   set /p NumWimSource=请输入PE系统映像文件序号,我不检测无效序号,默认1----
   set bVldNSr=n
   for /l %%i in (1,1,!CountWim!) do ( if !NumWimSource!==%%i set bVldNSr=y   )
   if !bVldNSr!==n echo 你没有输入有效PE系统映像文件序号,退出重来吧!&&goto End

   set /a a=0
   for /f "usebackq delims=" %%i in (%temp%\fdSeek.txt) do (
     set /a a+=1
     if !a!==!NumSdi! copy /y %%i !LabelEFI!:\!name_PE!\boot.sdi
   )

   set /a a=0
   for /f "usebackq delims=" %%i in (%temp%\fwSeek.txt) do (
     set /a a+=1
     if !a!==!NumWimSource! copy /y %%i !LabelEFI!:\!name_PE!\boot.wim
   )

)

if   !bIsUEFI!==n (
   set     bCopyBoot=n
   set /p  bCopyBoot=是否需要从PE源盘复制MBR启动环境文件,默认不,需要输入小写y----

   if not !bCopyBoot!==n (

      
      set bHvLSr=n
      for /l %%i in (1,1,5) do (
         if !bHvLSr!==n (
            set /p LPartPE=请输入PE源盘盘符,然后回车----
            if not exist !LPartPE!: echo 这个盘符根本就没有使用了,你不要搞笑好吧
            if     exist !LPartPE!: set bHvLSr=y
         )
      )

      if not exist !LPartPE!:\boot\ ( echo 这个盘里没有启动环境文件,你不要搞笑好吧!&& goto End )
      xcopy /h /y   !LPartPE!:\bootmgr   !LabelEFI!:\
      if     exist !LabelEFI!:\boot\  rd /s /q  !LabelEFI!:\boot\
      if not exist !LabelEFI!:\boot\  md !LabelEFI!:\boot\
      robocopy  !LPartPE!:\boot\     !LabelEFI!:\boot\  /e /xf bcd
   )
)

set     bbPE=y
set /p  bbPE=请问是否建PE菜单项,默认建,如果不建输入小写n----

if not !bbPE!==n (

   if  !bCopyPE!==n (
   ::没有复制源文件,说明ESP/MSR分区中已经存在PE源文件,查找相应路径
   echo.
   dir !LabelEFI!:\*.sdi /b /s >%temp%\fdSeek.txt
   echo 查找到!LabelEFI!分区下所有映像引导文件*.sdi如下表
   echo -----------------------------------------------------
   set /a a=0
   for /f "usebackq delims=" %%i in (%temp%\fdSeek.txt) do ( set /a a+=1&&echo 系统引导文件:!a! %%i )
   set /a CountWim=!a!
   if !a!==0   echo 该分区无PE系统映像引导文件,退出重来吧!&&goto End
   echo -----------------------------------------------------
   set /p NumSdi=请输入系统映像引导文件序号,我不检测无效序号,默认1----
   set bVldNSr=n
   for /l %%i in (1,1,!CountWim!) do ( if !NumSdi!==%%i set bVldNSr=y   )
   if !bVldNSr!==n echo 你没有输入有效PE系统映像文件序号,退出重来吧!&&goto End

   set /a a=0
   for /f "usebackq delims=" %%i in (%temp%\fdSeek.txt) do (
      set /a a+=1
      if !a!==!NumSdi! (
         set namePathSdi=%%i
         set name_PathSdi=!namePathSdi:~3,-9!
      )
   )
   echo 引导文件路径是:!name_PathSdi!
   set /p name_PathSdi=如果路径有误,请手工输入,默认不需要,直接回车----

   echo.
   dir !LabelEFI!:\*.wim /b /s >%temp%\fwSeek.txt
   echo 查找到!LabelEFI!分区下所有PE映像文件如下表
   echo -----------------------------------------------------
   set /a a=0
   for /f "usebackq delims=" %%i in (%temp%\fwSeek.txt) do ( set /a a+=1&&echo PE系统映像:!a! %%i)
   set /a CountWim=!a!
   if !a!==0   echo 该分区无PE系统映像文件,退出重来吧!&&goto End
   echo -----------------------------------------------------
   set /p NumWimSource=请输入PE系统映像文件序号,我不检测无效序号,默认1----
   set bVldNSr=n
   for /l %%i in (1,1,!CountWim!) do ( if !NumWimSource!==%%i set bVldNSr=y   )
   if !bVldNSr!==n echo 你没有输入有效PE系统映像文件序号,退出重来吧!&&goto End

   set /a a=0
   for /f "usebackq delims=" %%i in (%temp%\fwSeek.txt) do (
      set /a a+=1
      if !a!==!NumWimSource! (
         set namePathWim=%%i
         set name_PathWim=!namePathWim:~3,-9!
      )
   )

   echo PE系统文件路径是:!name_PathWim!
   set /p name_PathWim=如果路径有误,请手工输入,默认不需要,直接回车----

   )

set    name_MenuPE=PE_MBY
set /p name_MenuPE=输入菜单项名字,默认PE_MBY,可自行输入,如MAXDOS_WYS----



   echo list vol>%temp%\DiskPart.txt
   echo exit>>%temp%\DiskPart.txt
   diskpart /s %temp%\DiskPart.txt
   set /p NumVolESP=请输入GPT中ESP分区或MBR中MSR分区的卷编号,直接回车----
   bcdedit /create {bootmgr} /d "Marc Boot Manager" >nul 2>nul
   bcdedit /set {bootmgr} device partition=\device\harddiskvolume!NumVolESP! >nul 2>nul


::创建设备项
bcdedit  /create /d "!name_MenuPE!" /device>%~dp0fdid.txt
::取得所生成的设备标识符
for /f "tokens=2 delims= "  %%i in (%~dp0fdid.txt) do (set fdid=%%i)
::设置设备所在分区
bcdedit  /set !fdid! ramdisksdidevice partition=!LabelEFI!:
::设置设备所在的固定路径
bcdedit  /set !fdid! ramdisksdipath \!name_PathSdi!\boot.sdi
::创建菜单项
bcdedit  /create /d "!name_MenuPE!" /application osloader>%~dp0fmid.txt
::取得所生成的菜单标识符
for /f "tokens=2 delims= "  %%i in (%~dp0fmid.txt) do (set fmid=%%i)
::设置启动设备
bcdedit  /set !fmid! device ramdisk=[!LabelEFI!:]\!name_PathWim!\boot.wim,!fdid!
::设置系统设备
bcdedit  /set !fmid! osdevice ramdisk=[!LabelEFI!:]\!name_PathWim!\boot.wim,!fdid!
::设定启动程序(winload)的路径
if not !bIsUEFI!==n bcdedit  /set !fmid! path \windows\system32\winload.efi
if     !bIsUEFI!==n bcdedit  /set !fmid! path \windows\system32\winload.exe
::设置系统根目录
bcdedit  /set !fmid! systemroot \windows
::开启detecthal支持
bcdedit  /set !fmid! detecthal yes
::开启WinPE支持
bcdedit  /set !fmid! winpe yes
::设置nx为optin
bcdedit  /set !fmid! nx optin
::设置为最后一项显示
bcdedit  /displayorder !fmid! /addlast

bcdedit  /timeout 2
bcdedit  /enum

)


del /f  /s /q %~dp0fdid.txt>nul 2>nul
del /f  /s /q %~dp0fmid.txt>nul 2>nul

点评

楼主自己写的?我一时也没看完。MBR和GPT应该可以通过批处理自动识别的。另外,MSR能被访问吗? 要如何访问?据我所知,MSR分区是不能指定盘符的。  详情 回复 发表于 2014-4-8 21:18
回复

使用道具 举报

9#
发表于 2014-4-6 10:31:32 | 只看该作者
谢谢
回复

使用道具 举报

8#
发表于 2014-4-4 19:58:17 | 只看该作者
本帖最后由 yiwuyun 于 2014-4-4 20:08 编辑

boot是指从引导盘所在的盘启动,常常就是C,但有时就不是。boot具有通用性,特别对MBR盘,U盘和光盘如此。对GPT,boot就不行了,它是efi分区。此时就不是C了。
%bcddrv%、%bcddir% 这些都是人为定义的变量,不是系统变量,需要自己定义的。
回复

使用道具 举报

7#
发表于 2014-4-4 17:16:57 | 只看该作者
yiwuyun 发表于 2014-4-4 14:33
的开始之前加一句:set bcddrv=
将适用于任何MBR格式的盘。

请教一个问题:

前几天封装win7的时候才发现,ramdisk="[C:]...,封装后就无法启动了,是不是这里的guid封装后就失效了?

如果参考安装光盘上的引导项用ramdisk="[boot]...,封装后pe还能启动。不知道为什么
回复

使用道具 举报

6#
发表于 2014-4-4 14:33:15 | 只看该作者
的开始之前加一句:set bcddrv=[boot]
将适用于任何MBR格式的盘。

点评

请教一个问题: 前几天封装win7的时候才发现,ramdisk="[C:]...,封装后就无法启动了,是不是这里的guid封装后就失效了? 如果参考安装光盘上的引导项用ramdisk="...,封装后pe还能启动。不知道为什么  详情 回复 发表于 2014-4-4 17:16
回复

使用道具 举报

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

本版积分规则

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

闽公网安备 35020302032614号

GMT+8, 2024-11-17 21:32

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

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