Skip to content

Commit

Permalink
支持 Rufus 等启动盘制作工具
Browse files Browse the repository at this point in the history
  • Loading branch information
dsx42 committed Jul 16, 2022
1 parent 59cedf4 commit 34110f9
Show file tree
Hide file tree
Showing 3 changed files with 123 additions and 54 deletions.
51 changes: 35 additions & 16 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,8 +1,11 @@
# UnattendTool 简介

* 生成 Windows 系统自动安装应答文件 Unattend.xml
* 支持 Ventoy
* 只支持 Windows 10 或 Windows 11
* Windows 11 支持跳过硬件检测
* 支持 Ventoy 制作的启动盘
* 支持 Rufus 制作的启动盘
* 支持微软官方启动盘制作工具 `MediaCreationTool.exe` 制作的启动盘

# 下载

Expand All @@ -29,27 +32,43 @@

# 生成的应答文件在哪里?

* 默认情况下,在 `%userprofile%\Desktop\ventoy\script\` 目录下
* 若指定了应答文件目录,则在指定目录下的 `ventoy\script\` 目录下
* 默认情况下,在 `%userprofile%\Desktop\script\` 目录下
* 若指定了应答文件目录,则在指定目录下的 `script\` 目录下
* 若指定目录是镜像文件解压目录,存在 `setup.exe` 文件,则在指定目录下

# 生成的应答文件如何使用?

## 和 Venoty 一起使用

如下步骤 3 和步骤 4 可通过本工具完成
在 “输入 U 盘启动盘盘符或者镜像文件所在目录” 时,选择 Ventoy 启动盘的盘符即可

1. 准备一个 U 盘,用 Ventoy 制作成启动盘,详见:https://www.ventoy.net/cn/doc_start.html
2. 把 Windows 系统 ISO 镜像文件复制到 U 盘
3. 把应答文件复制到 U 盘
4. 修改 U 盘下的 Ventoy 配置文件 `ventoy\ventoy.json`,让镜像文件关联应答文件,详见:https://www.ventoy.net/cn/plugin_autoinstall.html
5. U 盘插入要安装系统的电脑,该电脑关机重启,进入 BIOS,修改为启动进入 U 盘
6. 进入 Ventoy 选择镜像的页面,选择要安装的镜像,选择要使用的应答文件
## 镜像文件解压后和 setup.exe 一起使用

## 和 setup.exe 一起使用
> PE 下也支持
1. 把 Windows 系统 ISO 镜像文件解压到指定目录
2. 把应答文件复制到解压后的目录
3. 进入解压后的目录,命令行下运行 `setup.exe /unattend:应答文件名称` 即可安装系统
在 “输入 U 盘启动盘盘符或者镜像文件所在目录” 时,选择镜像解压文件所在目录,运行生成的 `Install_Autounattend.cmd` 即可

> 原理:镜像解压后的 `setup.exe` 支持指定应答文件 `setup.exe /unattend:应答文件路径`
## 镜像文件挂载后和 setup.exe 一起使用

> PE 下也支持
在 “选择使用应答文件的 ISO 镜像文件” 时,选择镜像文件所在目录,挂载镜像文件后,运行生成的 `script\Install_xxx.cmd` 即可

> 原理:镜像解压后的 `setup.exe` 支持指定应答文件 `setup.exe /unattend:应答文件路径`
## 和 Rufus 一起使用

在 “输入 U 盘启动盘盘符或者镜像文件所在目录” 时,选择 Rufus 启动盘符即可

> 原理:启动盘根目录下存在 `Autounattend.xml` 时,会自动使用 `Autounattend.xml` 应答文件
## 和微软官方启动盘制作工具

在 “输入 U 盘启动盘盘符或者镜像文件所在目录” 时,选择微软官方启动盘制作工具制作的启动盘符即可

> 原理:启动盘根目录下存在 `Autounattend.xml` 时,会自动使用 `Autounattend.xml` 应答文件
# 支持的选项

Expand All @@ -74,7 +93,7 @@
[-PartitionStyle String]
[-FullName String]
[-Password String]
[-VentoyDriverLetter String]
[-DriverLetter String]
[-ISOPath String]
[-NotFormat]
```
Expand Down Expand Up @@ -104,7 +123,7 @@
* `MBR`:MBR 分区;注意,Windows 11 官方镜像不支持 `MBR` 分区
* `-FullName String`:系统安装后的登录账号名;推荐英文字母或数字的组合,尽量不使用中文或其他特殊字符;默认为 `'MyPC'`
* `-Password String`:系统安装后的登录账号密码;推荐不设置密码,系统安装后再自行设置密码;默认无密码
* `-VentoyDriverLetter String`已安装 Ventoy 的 U 盘驱动器;默认为当前用户的桌面
* `-DriverLetter String`U 盘启动盘盘符或者镜像文件所在目录;默认为当前用户的桌面
* `-ISOPath String`:使用应答文件的 ISO 镜像文件的路径;默认未指定
* `-NotFormat`:安装系统时不格式化所选硬盘分区;默认安装时会格式化所选硬盘分区

Expand Down
124 changes: 87 additions & 37 deletions UnattendTool.ps1
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@
$PartitionStyle = 'GPT',
$FullName = 'MyPC',
$Password = '',
$VentoyDriverLetter = '',
$DriverLetter = '',
$ISOPath = '',
[switch]$Interactive,
[switch]$NotFormat,
Expand Down Expand Up @@ -804,13 +804,13 @@ function ShowPasswordInput {
}
}

function ShowVentoyDriverLetterSelect {
function ShowDriverLetterSelect {

$CurrentDisks = GetCurrentDisk

Write-Host -Object '==============================='
Write-Host -Object '输入已安装 Ventoy 的 U 盘驱动器'
Write-Host -Object '==============================='
Write-Host -Object '======================================='
Write-Host -Object '输入 U 盘启动盘盘符或者镜像文件所在目录'
Write-Host -Object '======================================='
Write-Host -Object ''
Write-Host -Object '当前系统识别到的驱动器如下:'

Expand All @@ -836,7 +836,7 @@ function ShowVentoyDriverLetterSelect {
while ($true) {
Write-Host -Object ''
$InputOption = Read-Host `
-Prompt '请输入已安装 Ventoy 的 U 盘驱动器(0 表示将应答文件保存到当前用户的桌面上),按回车键确认'
-Prompt '请输入 U 盘启动盘盘符或者镜像文件所在目录(0 表示将应答文件保存到当前用户的桌面上),按回车键确认'
if ($InputOption -ieq '') {
Write-Host -Object ''
Write-Warning -Message '选择无效,请重新输入'
Expand All @@ -855,7 +855,7 @@ function ShowVentoyDriverLetterSelect {
}
else {
Write-Host -Object ''
Write-Warning -Message '驱动器不存在,请重新输入'
Write-Warning -Message '输入路径不存在,请重新输入'
}
}
}
Expand Down Expand Up @@ -1133,9 +1133,9 @@ if ($Interactive) {
}
$FullName = ShowNameInput
$Password = ShowPasswordInput
$VentoyDriverLetter = ShowVentoyDriverLetterSelect
if ($VentoyDriverLetter) {
$ISOPath = ShowGetISOPath -Path $VentoyDriverLetter
$DriverLetter = ShowDriverLetterSelect
if ($DriverLetter) {
$ISOPath = ShowGetISOPath -Path $DriverLetter
}
}

Expand Down Expand Up @@ -1201,50 +1201,100 @@ elseif ($PartitionStyle -ieq 'MBR') {
$PartitionStyle = 'MBR'
}

if ('' -ieq $VentoyDriverLetter) {
if ('' -ieq $DriverLetter) {
$ParentPath = GetDefaultFolderPath
}
else {
$ParentPath = $VentoyDriverLetter
$ParentPath = $DriverLetter
if ($ISOPath) {
$Letter1 = Split-Path -Path $ISOPath -Qualifier
$Letter2 = Split-Path -Path $ISOPath -Qualifier
if ($Letter1 -ine $Letter2) {
Write-Warning -Message '参数 ISOPath 指定的路径必须和参数 VentoyDriverLetter 指定的驱动器属于同一个驱动器'
Write-Warning -Message '参数 ISOPath 指定的路径必须和参数 DriverLetter 指定的驱动器属于同一个驱动器'
[System.Environment]::Exit(0)
}
}
}

$VentoyConfigParentPath = Join-Path -Path $ParentPath -ChildPath 'ventoy'
if (!$(Test-Path -Path $VentoyConfigParentPath -PathType Container)) {
New-Item -Path $VentoyConfigParentPath -ItemType Directory -Force | Out-Null
}
$VentoyConfigScriptPath = Join-Path -Path $VentoyConfigParentPath -ChildPath 'script'
if (!$(Test-Path -Path $VentoyConfigScriptPath -PathType Container)) {
New-Item -Path $VentoyConfigScriptPath -ItemType Directory -Force | Out-Null
$ProductInfo = @{}
if ($WindowsProductName) {
$ProductInfo = $WindowsProduct[$WindowsProductName]
}

$DiskTypeStr = ''
if ($WipeDisk -eq 1) {
$DiskTypeStr = '_CreateGPT'
}
elseif ($WipeDisk -eq 2) {
$DiskTypeStr = '_CreateMBR'
}
elseif (!$NotFormat) {
$DiskTypeStr = "_Format$PartitionStyle"
$UnattendName = 'Autounattend'
if ($ISOPath) {
$VentoyConfigParentPath = Join-Path -Path $ParentPath -ChildPath 'ventoy'
if (!$(Test-Path -Path $VentoyConfigParentPath -PathType Container)) {
New-Item -Path $VentoyConfigParentPath -ItemType Directory -Force | Out-Null
}
}
$ProductInfo = @{}
if ('' -ieq $WindowsProductName) {
$UnattendPath = $VentoyConfigScriptPath + '\Unattend_Windows_' + $OsVersion + '_' + $Architecture + '_' `
+ $Language + $DiskTypeStr + '_' + $FullName + '.xml'
if (!(Test-Path -Path "$ParentPath\setup.exe" -PathType Leaf)) {
$VentoyConfigScriptPath = Join-Path -Path $ParentPath -ChildPath 'script'
if (!$(Test-Path -Path $VentoyConfigScriptPath -PathType Container)) {
New-Item -Path $VentoyConfigScriptPath -ItemType Directory -Force | Out-Null
}

$DiskTypeStr = ''
if ($WipeDisk -eq 1) {
$DiskTypeStr = '_CreateGPT'
}
elseif ($WipeDisk -eq 2) {
$DiskTypeStr = '_CreateMBR'
}
elseif (!$NotFormat) {
$DiskTypeStr = "_Format$PartitionStyle"
}

if ('' -ieq $WindowsProductName) {
$UnattendName = 'Unattend_Windows_' + $OsVersion + '_' + $Architecture + '_' `
+ $Language + $DiskTypeStr + '_' + $FullName
}
else {
$NoSpaceName = $ProductInfo['NoSpaceName']
$UnattendName = 'Unattend_Windows_' + $OsVersion + '_' + $NoSpaceName + '_' `
+ $Architecture + '_' + $Language + $DiskTypeStr + '_' + $FullName
}
$UnattendPath = "$VentoyConfigScriptPath\$UnattendName.xml"

Remove-Item -Path "$VentoyConfigScriptPath\Install_$UnattendName.cmd" -Force -ErrorAction SilentlyContinue
$GB2312Encoding = [System.Text.Encoding]::GetEncoding('gb2312')
$CmdContents = @(
'@echo off',
':GetSetupPath',
'set /P setupPath=请输入镜像挂载或解压后的目录:',
'if not exist %setupPath%\setup.exe (',
' echo.',
' echo 目录 %setupPath% 下不存在 setup.exe,并非镜像挂载或解压后的目录,请重新确认输入',
' echo.',
' goto GetSetupPath',
')'
)
if (11 -eq $OsVersion) {
$CmdContents += 'reg add "HKLM\System\Setup\LabConfig" /v "BypassTPMCheck" /t REG_DWORD /d "1" /f'
$CmdContents += 'reg add "HKLM\System\Setup\LabConfig" /v "BypassSecureBootCheck" /t REG_DWORD /d "1" /f'
$CmdContents += 'reg add "HKLM\System\Setup\LabConfig" /v "BypassRAMCheck" /t REG_DWORD /d "1" /f'
$CmdContents += 'reg add "HKLM\System\Setup\LabConfig" /v "BypassStorageCheck" /t REG_DWORD /d "1" /f'
$CmdContents += 'reg add "HKLM\System\Setup\LabConfig" /v "BypassCPUCheck" /t REG_DWORD /d "1" /f'
}
$CmdContents += "%setupPath%\setup.exe /unattend:%~dp0$UnattendName.xml"
[System.IO.File]::WriteAllLines("$VentoyConfigScriptPath\Install_$UnattendName.cmd", $CmdContents, $GB2312Encoding)
}
else {
$ProductInfo = $WindowsProduct[$WindowsProductName]
$NoSpaceName = $ProductInfo['NoSpaceName']
$UnattendPath = $VentoyConfigScriptPath + '\Unattend_Windows_' + $OsVersion + '_' + $NoSpaceName + '_' `
+ $Architecture + '_' + $Language + $DiskTypeStr + '_' + $FullName + '.xml'
$UnattendPath = "$ParentPath\$UnattendName.xml"
Remove-Item -Path "$ParentPath\Install_Autounattend.cmd" -Force -ErrorAction SilentlyContinue
$GB2312Encoding = [System.Text.Encoding]::GetEncoding('gb2312')
$CmdContents = @(
'@echo off'
)
if (11 -eq $OsVersion) {
$CmdContents += 'reg add "HKLM\System\Setup\LabConfig" /v "BypassTPMCheck" /t REG_DWORD /d "1" /f'
$CmdContents += 'reg add "HKLM\System\Setup\LabConfig" /v "BypassSecureBootCheck" /t REG_DWORD /d "1" /f'
$CmdContents += 'reg add "HKLM\System\Setup\LabConfig" /v "BypassRAMCheck" /t REG_DWORD /d "1" /f'
$CmdContents += 'reg add "HKLM\System\Setup\LabConfig" /v "BypassStorageCheck" /t REG_DWORD /d "1" /f'
$CmdContents += 'reg add "HKLM\System\Setup\LabConfig" /v "BypassCPUCheck" /t REG_DWORD /d "1" /f'
}
$CmdContents += '%~dp0setup.exe /unattend:%~dp0Autounattend.xml'
[System.IO.File]::WriteAllLines("$ParentPath\Install_Autounattend.cmd", $CmdContents, $GB2312Encoding)
}

UpdateVentoyConfig -ISOPath $ISOPath -UnattendPath $UnattendPath -VentoyConfigParentPath $VentoyConfigParentPath
Expand Down
2 changes: 1 addition & 1 deletion product.json
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
"author": "dsx42",
"license": "GPL-3.0",
"home": "https://github.com/dsx42/UnattendTool",
"version": "2022.7.16",
"version": "2022.7.17",
"files": [
"UnattendTool.cmd",
"UnattendTool.ps1",
Expand Down

0 comments on commit 34110f9

Please sign in to comment.