|
本帖最后由 sivancc 于 2025-1-4 16:30 编辑
@echo off
chcp 65001
setlocal enabledelayedexpansion
del ub.txt >nul 2>&1
del sku.csv >nul 2>&1
del skup.csv >nul 2>&1
del cl.txt >nul 2>&1
del zxt.txt >nul 2>&1
del nwfq.txt >nul 2>&1
del clhd.txt >nul 2>&1
del ssd.txt >nul 2>&1
del ssd1.txt >nul 2>&1
del rl2.txt >nul 2>&1
reg query HKLM\System\CurrentControlSet\Control /v PEFirmwareType >>ub.txt
set ub=
findstr /c:"0x1" ub.txt >nul && set ub=BIOS
findstr /c:"0x2" ub.txt >nul && set ub=UEFI
echo PE启动模式 = %ub%
::****************************************************************************
::skup主板型号哈希表开始
@echo PRIMEB651M-K,PRIMEB650M-K-WIN11.wim>>skup.csv
::skup主板型号哈希表结束
::****************************************************************************
::sku产品型号哈希表开始
@echo Latitude3490,Win10_x64_home_Dell3490.wim>>sku.csv
@echo HPLaptop14s-dr2xxx,Win10_x64_home_HPLaptop14s11u.wim >>sku.csv
@echo HPLaptop14s-cr2xxx,Win10_x64_home_HPLaptop14s10.wim >>sku.csv
@echo 20WK006FCD,Win10_x64_home_X13-11u.wim >>sku.csv
@echo HPLaptop14s-cr1xxx,Win10_x64_home_HPLaptop14s.wim >>sku.csv
@echo 20U2S2XK00,win10_x64_home_L14.wim >>sku.csv
::sku产品型号哈希表结束
::****************************************************************************
echo ***********************************************************************************
echo * Name: Microsoft WINPE By:sivanxiao
echo * Author: sivan
echo * Version: V1.3
echo * Target: PE
echo * FIR:WIM/ISO-ESD/ISO-WIM
echo *
echo ***********************************************************************************
nircmdc sendkeypress F11
echo 1-iso/2-wim||不选择5s后默认=wim
:: 设定 10 秒内选择
choice /c 12 /t 5 /d 2 /n >nul
:: 根据用户的选择执行不同操作
if errorlevel 2 (
echo 你选择了 WIM
set azms=wim
) else (
echo 你选择了 ISO
set azms=iso
)
::*******************************************************************************
::******************************机器配置显示**************************************
::*******************************************************************************
set "Model="
for /f "tokens=2 delims==" %%i in ('wmic csproduct get name /value') do set "Model=%%i"
set "Model=%Model: =%"
:: 显示获取的产品名称
echo Product Name: [%Model%]
for /f "tokens=*" %%A in ('powershell -Command "(Get-CimInstance -ClassName Win32_BaseBoard | Select-Object -ExpandProperty Product) -replace ' ',''"') do set MotherboardName=%%A
echo 主板型号:%MotherboardName%
:: 调用 PowerShell 获取CPU型号
for /f "tokens=*" %%A in ('powershell -Command "Get-CimInstance -ClassName Win32_Processor | Select-Object -ExpandProperty Name"') do set CPUModel=%%A
echo CPU型号: %CPUModel%
:: 调用 PowerShell 获取内存容量
rem for /f "tokens=*" %%A in ('powershell -Command "Get-CimInstance -ClassName Win32_PhysicalMemory | ForEach-Object { $_.Capacity/1GB } | Measure-Object -Sum | Select-Object -ExpandProperty Sum"') do set TotalMemory=%%A
rem echo 内存总容量: %TotalMemory% GB
::*******************************************************************************
::******************************机器类型判断**************************************
::*******************************************************************************
set pc=
set bt=0
for /f "tokens=*" %%i in ('powershell -command "(Get-WmiObject -Class Win32_Battery).EstimatedChargeRemaining"') do set bt=%%i
echo 当前电量百分比: %bt%
REM 检查电量
if %bt% GEQ 1 (
set pc=notebook
set ucsv=sku
set umod=Model
) else (
set pc=pc
set ucsv=skup
set umod=MotherboardName
)
echo %pc%
::*******************************************************************************
::******************************硬盘信息获取**************************************
::*******************************************************************************
for %%a in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (if exist %%a:\iso\ set src=%%a:)
echo %src%
set drive=%src%
for /f "delims=" %%i in ('powershell -command "Get-Partition -DriveLetter '%drive:~0,1%' | Select-Object -ExpandProperty DiskNumber"') do set disk=%%i
echo %drive%所在的磁盘编号是%disk%
set disk1=%disk%
::*******************************************************************************
::************************************SSD***************************************
::*******************************************************************************
::筛选除开usb的硬盘
rem powershell -Command "Get-Disk | Where-Object { $_.BusType -ne 'USB' } | Select-Object -Property Number, FriendlyName,BusType"
echo 获取本机磁盘信息
set SSDDeviceIds=
:: 获取所有 SSD 硬盘的 DeviceId
for /f "tokens=*" %%i in ('powershell -Command "Get-PhysicalDisk | Where-Object { $_.MediaType -eq 'SSD' } | Select-Object -ExpandProperty DeviceId"') do (
if defined SSDDeviceIds (
set SSDDeviceIds=!SSDDeviceIds!;%%i
) else (
set SSDDeviceIds=%%i
)
)
:: 输出所有 DeviceId
echo SSD DeviceIds: %SSDDeviceIds%
set count=0
for %%a in (%SSDDeviceIds%) do (
set /a count+=1
)
::*******************************************************************************
::************************************HHD***************************************
::*******************************************************************************
:: 获取 HDD 硬盘信息前先判断是否存在 HDD 硬盘
for /f "tokens=*" %%i in ('powershell -Command "Get-PhysicalDisk | Where-Object { $_.MediaType -eq 'HDD' } | Select-Object -ExpandProperty DeviceId"') do set HDDExists=%%i
if defined HDDExists (
goto yeshd
)
goto nohd
:yeshd
echo 找到HDD硬盘,继续获取HDD信息...
set HDDDeviceIds=
:: 获取所有 HDD 硬盘的 DeviceId
for /f "tokens=*" %%i in ('powershell -Command "Get-PhysicalDisk | Where-Object { $_.MediaType -eq 'HDD' } | Select-Object -ExpandProperty DeviceId"') do (
if defined HDDDeviceIds (
set HDDDeviceIds=!HDDDeviceIds!;%%i
) else (
set HDDDeviceIds=%%i
set hdfq=%%i
)
)
:: 输出所有 DeviceId
if defined HDDDeviceIds (
echo %HDDDeviceIds%
@echo select disk %hdfq% >>clhd.txt
@echo clean >>clhd.txt
@echo convert gpt >>clhd.txt
@echo create partition efi size=100 >>clhd.txt
@echo format quick fs=fat32 >>clhd.txt
@echo assign >>clhd.txt
@echo create partition msr size=16 >>clhd.txt
@echo create partition primary >>clhd.txt
@echo format quick fs=ntfs >>clhd.txt
@echo assign >>clhd.txt
@echo list volume >>clhd.txt
@echo exit >>clhd.txt
diskpart.exe /s clhd.txt
)
goto end
:nohd
echo 没有找到HDD硬盘,跳过 HDD 相关操作...
:end
:: 结束脚本
powershell -ExecutionPolicy Bypass -File "%src%\script.ps1"
::*******************************************************************************
::************************************pe硬盘筛选********************************
::*******************************************************************************
:: 遍历 SSDDeviceIds,筛选出不等于 disk1 的 DeviceId
set filteredDeviceIds=
for %%i in (%SSDDeviceIds%) do (
if %%i NEQ %disk1% (
if defined filteredDeviceIds (
set filteredDeviceIds=!filteredDeviceIds!;%%i
) else (
set filteredDeviceIds=%%i
)
)
)
del rl.txt >nul 2>&1
:: 输出筛选后的 DeviceIds
echo 能安装系统的 DeviceIds: !filteredDeviceIds!
for %%i in (!filteredDeviceIds!) do (
echo %%i >>rl.txt
@echo list disk >>cl.txt
@echo select disk %%i >>cl.txt
@echo clean >>cl.txt
diskpart.exe /s cl.txt
)
:: 假设 rl.txt 文件中存储了硬盘的 DeviceId
set minDiskSize=2048
set minDiskId=
set minDiskSizeActual=0
:: 逐行读取 rl.txt 文件
for /f "delims=" %%i in (rl.txt) do (
set diskId=%%i
echo 正在查询 DeviceId: !diskId!
:: 使用 PowerShell 获取该 DeviceId 的硬盘大小信息 (容量)
for /f "delims=" %%s in ('powershell -Command "$disk = Get-PhysicalDisk | Where-Object { $_.DeviceId -eq !diskId! }; if ($disk) { [math]::Floor($disk.Size / 1GB) } else { '未找到该硬盘' }"') do (
set diskSize=%%s
echo 当前硬盘容量: !diskSize! GB
:: 检查硬盘容量是否在限制范围内
if !diskSize! lss %minDiskSize% if !diskSize! gtr 0 (
:: 如果当前硬盘容量更小,或者容量相同但 DeviceId 更小,则更新最小硬盘信息
if not defined minDiskId (
set minDiskId=!diskId!
set minDiskSizeActual=!diskSize!
) else (
if !diskSize! lss !minDiskSizeActual! (
set minDiskId=!diskId!
set minDiskSizeActual=!diskSize!
) else if !diskSize! equ !minDiskSizeActual! (
if !diskId! lss !minDiskId! (
set minDiskId=!diskId!
set minDiskSizeActual=!diskSize!
)
)
)
)
)
)
:: 输出最小容量的硬盘 DeviceId
if defined minDiskId (
echo 容量最小的硬盘 DeviceId 是: !minDiskId!,容量: !minDiskSizeActual! GB
set clssd=!minDiskId!
) else (
cls
echo SSD磁盘信息
powershell -Command "Get-PhysicalDisk | Where-Object { $_.MediaType -eq 'SSD' } | Select-Object -Property DeviceId, MediaType, @{Name='CapacityGB'; Expression={ [math]::Round($_.Size / 1GB, 0) }} | Format-Table -AutoSize | Out-File -FilePath 'ssd1.txt'"
type ssd1.txt
echo 未获取内置磁盘或者没有符合条件的SSD硬盘。
goto Finish
)
:: 根据 minDiskSizeActual 设置 ssdsize
if !minDiskSizeActual! leq 256 (
set ssdsize=256
) else if !minDiskSizeActual! leq 512 (
set ssdsize=512
) else if !minDiskSizeActual! leq 1024 (
set ssdsize=1024
) else if !minDiskSizeActual! leq 2048 (
set ssdsize=2048
) else (
set ssdsize=0
)
:: 输出结果
echo 最小容量硬盘的容量范围是:!ssdsize!G
echo 格式化硬盘准备装系统%clssd%
@echo select disk %clssd% >>zxt.txt
@echo clean >>zxt.txt
@echo convert gpt >>zxt.txt
@echo create partition efi size=300 >>zxt.txt
@echo format quick fs=fat32 label="System" >>zxt.txt
@echo assign letter="S" >>zxt.txt
@echo create partition msr size=16 >>zxt.txt
@echo create partition primary >>zxt.txt
@echo format quick fs=ntfs label="Windows" >>zxt.txt
@echo assign letter="W" >>zxt.txt
@echo list volume >>zxt.txt
@echo exit >>zxt.txt
diskpart.exe /s zxt.txt
:: 遍历 filteredDeviceIds
for %%i in (%filteredDeviceIds%) do (
if not %%i==%minDiskId% (
if not "%%i"=="" (
set nwfq=%%i
echo %%i >> rl2.txt
)
)
)
::*******************************************************************************
::******************************非PE盘系统盘/格式化**************************************
::*******************************************************************************
if defined nwfq (
echo %nwfq%
echo nwfq=%nwfq%
echo %%i >> rl2.txt
@echo select disk %nwfq% >>nwfq.txt
@echo clean >>nwfq.txt
@echo convert gpt >>nwfq.txt
@echo create partition efi size=100 >>nwfq.txt
@echo format quick fs=fat32 >>nwfq.txt
@echo assign >>nwfq.txt
@echo create partition msr size=16 >>nwfq.txt
@echo create partition primary >>nwfq.txt
@echo format quick fs=ntfs >>nwfq.txt
@echo assign >>nwfq.txt
@echo list volume >>nwfq.txt
@echo exit >>nwfq.txt
diskpart.exe /s nwfq.txt
)
::*********************************************************************************
::******************************iso模式的跳转**************************************
::**********************************************************************************
if "%azms%"=="iso" (goto iso) else (echo wim)
::*******************************************************************************
::******************************自动模式和手动模式的判断************************
::*******************************************************************************
if "%pc%"=="notebook" (goto sku) else (goto skup)
:sku
:: 读取 sku.csv 文件并查找匹配的后缀
set Found=false
for /f "tokens=1,2 delims=," %%B in (sku.csv) do (
if /i "%%B" == "%Model%" (
echo 找到匹配项: %%B, %%C
set Found=true
set csimg=%%C
)
)
if defined csimg (
echo %csimg%
goto wimzd
)
:: 如果没有找到匹配项
if not %Found%==true (
echo 未找到与 %Model% 匹配的后缀。
goto wimsd
)
:skup
:: 读取 skup.csv 文件并查找匹配的后缀
set Found=false
for /f "tokens=1,2 delims=," %%B in (skup.csv) do (
if /i "%%B" == "%MotherboardName%" (
echo 找到匹配项: %%B, %%C
set Found=true
set csimg=%%C
)
)
if defined csimg (
echo %csimg%
goto wimzd
)
:: 如果没有找到匹配项
if not %Found%==true (
echo 未找到与 %MotherboardName% 匹配的后缀。
goto wimsd
)
:wimsd
echo 手动选择
for %%a in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (if exist %%a:\iso\ set src=%%a:)
echo %src%
echo.&echo [images]
dir /a-d/b/s %src%\images\*.wim | findstr /n . >imageess.txt
for /f "tokens=1* delims=:" %%i in (imageess.txt) do (echo.&echo [%%i] %%~nxj)
:loop
echo.&set /p index="Select the Number: "
if /i "%index%" equ "e" goto :eof
findstr "^%index%:" imageess.txt>target.txt
if not "%errorlevel%" equ "0" goto loop
for /f "tokens=1* delims=:" %%i in (target.txt) do (set "imagee=%%j")
del imageess.txt target.txt
echo ******************************
echo %imagee%
echo ******************************
echo 将%csimg%应用于卷标W
dism.exe /apply-image /imagefile:%imagee% /index:1 /applydir:W:\
echo %Model%,%imagee%/%CPUModel% >>%src%\sku.txt
echo %MotherboardName%,%imagee%/%CPUModel% >>%src%\skup.txt
echo 给卷标W修复引导
bcdboot W:\Windows /s S: /f ALL
goto Finish
:wimzd
echo 如果自动匹配安装失败-跳转手动
if "%pc%"=="notebook" (set csv=sku) else (set csv=skup)
@for %%a in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do @if exist %%a:\Images\ set IMAGESDRIVE=%%a
@echo The Images folder is on drive: %IMAGESDRIVE%
set "folder=%IMAGESDRIVE%:\Images"
if exist "%folder%\%csimg%" (
echo %folder%存在这个文件-开始安装
) else (
echo %folder%不存在这个文件-进入手选
goto wimsd
)
:azxt
echo 将%csimg%应用于卷标W
dism.exe /apply-image /imagefile:%IMAGESDRIVE%:\Images\%csimg% /index:1 /applydir:W:\
echo 给卷标W修复引导
bcdboot W:\Windows /s S: /f ALL
goto Finish
::******************************************************************************************************
::******************************************************************************************************
::*********************************************ISO*************************************
::******************************************************************************************************
::********以下代码修改增加来自原作者知乎-南柯一梦***************
::******************************************************************************************************
:iso
PowerShell -Command "Write-Host 'iso模式' -ForegroundColor Red"
:SelectISO
echo.&echo [Images]
dir /a-d/b/s %src%\iso\*.iso | findstr /n . >images.txt
for /f "tokens=1* delims=:" %%i in (images.txt) do (echo.&echo [%%i] %%~nxj)
:loop
echo.&set /p index="Select the Number: "
if /i "%index%" equ "e" goto :eof
findstr "^%index%:" images.txt>target.txt
if not "%errorlevel%" equ "0" goto loop
for /f "tokens=1* delims=:" %%i in (target.txt) do (set "image=%%j")
del images.txt target.txt
:ExportImage
if exist W:\tmp rd /q /s W:\tmp
md W:\tmp
:: 提取镜像文件
7z.exe x "%image%" -o"W:\tmp"
:: 检查 install.wim 或 install.esd 存在,并设置 isowim 变量
if exist "W:\tmp\sources\install.wim" (
set isowim=iwim
) else if exist "W:\tmp\sources\install.esd" (
set isowim=iesd
) else (
echo Neither install.wim nor install.esd found in W:\tmp\sources
goto :eof
)
:: 获取镜像信息
if "%isowim%" == "iwim" (
dism /Get-ImageInfo /ImageFile:W:\tmp\sources\install.wim
) else if "%isowim%" == "iesd" (
dism /Get-ImageInfo /ImageFile:W:\tmp\sources\install.esd
)
:: 让用户选择要导出的镜像索引
echo.&set /p index="Type the index number: "
if "%isowim%" == "iwim" (
dism /Export-Image /SourceImageFile:W:\tmp\sources\install.wim /SourceIndex:%index% /DestinationImageFile:W:\new.wim
) else if "%isowim%" == "iesd" (
dism /Export-Image /SourceImageFile:W:\tmp\sources\install.esd /SourceIndex:%index% /DestinationImageFile:W:\new.wim
)
:: 清理临时文件夹
rd /q /s W:\tmp
:SkipOOBE
echo.&echo [SkipOOBE]
echo.&echo [1] Yes, skip oobe
echo.&echo [2] No
echo.&choice /c 12 /n /t 10 /d 2 /m "Select the Number: "
if errorlevel 2 (set skip_oobe=No)
if errorlevel 1 (set skip_oobe=Yes)
:ApplyImage
dism /apply-image /imagefile:W:\new.wim /index:1 /applydir:W:\
del W:\new.wim
dism /image:W:\ /add-driver /driver:%src%\bin\Drivers /recurse
echo.&bcdboot W:\Windows /s S: /f ALL
:SetConf
if /i "%skip_oobe%" == "No" goto Finish
if not exist W:\Windows\Web\Wallpaper\My md W:\Windows\Web\Wallpaper\My
copy /y %src%\bin\conf\wallpaper.jpg W:\Windows\Web\Wallpaper\My\ >nul
if not exist W:\Windows\Panther md W:\Windows\Panther
copy /y %src%\bin\conf\unattend.xml W:\Windows\Panther\Unattend.xml >nul
::安装成功后的操作
:Finish
echo 测试文件拷贝
IF NOT EXIST "W:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp" (
MD "W:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp"
)
IF NOT EXIST W:\Users\Public\Desktop (
MD W:\Users\Public\Desktop
)
rem copy /y %src%\start.bat "W:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp\"
copy /y %src%\bin\7500f.bat W:\Users\Public\Desktop\
copy /y %src%\bin\SOS.exe W:\Users\Public\Desktop\
PowerShell -Command "Write-Host '1-重启 0-关机' -ForegroundColor Yellow"
copy /y %src%\bin\reb.bat X:\Windows\System32\
call X:\Windows\System32\reb.bat
goto :eof
endlocal
测试脚本 需要在某一个分区 建立iso和images文件夹 iso放iso文件 原版系统那些 images放.wim文件
大佬 目前新的外置包已解决机器配置显示ok 硬盘信息获取和ssd/hdd分类哪儿获取硬盘编号会闪退 运行纯powershell代码会报错Get-Disk : 无效命名空间 所在位置 E:\script.ps1:1 字符: 1
+ Get-Disk | Where-Object { $_.BusType -ne 'USB' } |
+ ~~~~~~~~
+ CategoryInfo : MetadataError: (MSFT_Disk:ROOT/Microsoft/Windows/Storage/MSFT_Disk) [Get-Disk], CimException
+ FullyQualifiedErrorId : HRESULT 0x8004100e,Get-Disk
使用“0”个参数调用“MoveNext”时发生异常:“无效命名空间 ”
所在位置 X:\windows\system32\WindowsPowerShell\v1.0\Modules\Storage\StorageScripts.psm1:2646 字符: 20
+ while ($enumerator.MoveNext())
+ ~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : CimException |
|