KB5034441での0x80070643エラー回避のスクリプト日本語化

2024年1月の更新プログラムにて0x80070643のエラー発生が多数報告されています。

原因はWinRE(回復パーティション)の空き容量が不足しているのが原因だそうです。

[この問題を一時的に解決するPowerShellのスクリプトがMSより公開](https://support.microsoft.com/ja-jp/topic/kb5034957-cve-2024-20666-%E3%81%AE%E3%82%BB%E3%82%AD%E3%83%A5%E3%83%AA%E3%83%86%E3%82%A3%E3%81%AE%E8%84%86%E5%BC%B1%E6%80%A7%E3%81%AB%E5%AF%BE%E5%87%A6%E3%81%99%E3%82%8B%E3%81%9F%E3%82%81%E3%81%AB-%E5%B1%95%E9%96%8B%E3%81%95%E3%82%8C%E3%81%9F%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E3%81%AE-winre-%E3%83%91%E3%83%BC%E3%83%86%E3%82%A3%E3%82%B7%E3%83%A7%E3%83%B3%E3%82%92%E6%9B%B4%E6%96%B0%E3%81%99%E3%82%8B-0190331b-1ca3-42d8-8a55-7fc406910c10)されましたが、

それとは別に、回復パーティションを増やすPowerShellが公開されています。

https://learn.microsoft.com/ja-jp/windows-hardware/manufacture/desktop/add-update-to-winre?view=windows-11#extend-the-windows-re-partition

こちらを使用でもエラー解消はされました。
ただ、英語で書かれているので、英語が読めない人向けに
日本語に翻訳してみました。

:::note info
Deeplで翻訳し、一部私の方で修正しています。
:::


元のスクリプトはWinREのバックアップフォルダー、実行確認のプロンプト表示の有無を引数として持ち、
バックアップフォルダーについては引数省略するとスクリプト実行時にフォルダーパス聞かれるため、
自動実行かつスクリプトのあるフォルダーに「backup_pe」というフォルダーを作成し、
そこにwinREのバックアップが行われるようにしています。

:::note warn
このスクリプトを実行したことにより不具合・損害等が発生しても責任は持ちません。
自己責任にて実行ください。
:::

通常、PowerShellは権限付与しないと実行できないようになっているので、
自動で権限付与し実行するバッチを作成しました。

:::note info
バッチはPowerShellスクリプトと同じフォルダーに配置して実行してください。
:::

```bat:run.bat
@echo off

rem 管理者権限強制実行
whoami /priv | find "SeDebugPrivilege" > nul
if %errorlevel% neq 0 (
  @powershell start-process %~0 -verb runas
  echo 管理者権限がありません。管理者権限で実行します
  exit
)

cd /d %~dp0
call powershell -nologo -executionpolicy bypass -file Extend_WinRE.ps1
```

```powershell:Extend_WinRE.ps1

# ------------------------------------
# 関数のヘルプ
# ------------------------------------
# ログメッセージ
function LogMessage([string]$message)
{
	$message = "$message"
	Write-Host $message
}
# 文字列から数字を取り出す
function ExtractNumbers([string]$str)
{
	$cleanString = $str -replace "[^0-9]"
	return [long]$cleanString
}
# fsutilを使ってパーティション情報を表示する
# 配列を返します。最初の値は合計サイズ、2番目の値は空き容量です
function DisplayPartitionInfo([string[]]$partitionPath)
{
	$volume = Get-WmiObject -Class Win32_Volume | Where-Object { $partitionPath -contains $_.DeviceID }
	LogMessage("  パーティション容量: " +  $volume.Capacity)
	LogMessage("  パーティション空き容量: " + $volume.FreeSpace)
	return $volume.Capacity, $volume.FreeSpace
} 
# WinREのステータスを表示する
function DisplayWinREStatus()
{
	# WinREパーティション情報の取得
	$WinREInfo = Reagentc /info
	foreach ($line in $WinREInfo)
	{
		$params = $line.Split(':')
		if ($params.Count -lt 2)
		{
			continue
		}
		if (($params[1].Trim() -ieq "Enabled") -Or (($params[1].Trim() -ieq "Disabled")))
		{
			$Status = $params[1].Trim() -ieq "Enabled"
			LogMessage($line.Trim())
		}
		if ($params[1].Trim() -like "\\?\GLOBALROOT*")
		{
			$Location = $params[1].Trim()
			LogMessage($line.Trim())
		}
	}
	
	return $Status, $Location
}
# ------------------------------------
# メイン実行
# ------------------------------------
# エラー解除
$Error.Clear()
# ------------------------------------
# 実行に必要な情報を収集するためのシステム調査
# WinREの状態をチェックし、OSとWinREのパーティション情報を収集する必要がある
# ------------------------------------

$BackupFolder = Split-Path $MyInvocation.MyCommand.Path -Parent + "backup_pe"

if(Test-Path $BackupFolder){
    Remove-Item $BackupFolder -Recurse -Force
}

LogMessage("開始時刻: $([DateTime]::Now)")
LogMessage("システムの検証...")
$NeedShrink = $true
$NeedCreateNew = $false
$NeedBackup = $false
# WinREパーティション情報の取得
$InitialWinREStatus = DisplayWinREStatus
$WinREStatus = $InitialWinREStatus[0]
$WinRELocation = $InitialWinREStatus[1]
if (!$WinREStatus)
{
	LogMessage("エラー: WinREがありません。")
	exit 1
}
# システムディレクトリとReAgent xmlファイルの取得
$system32Path = [System.Environment]::SystemDirectory
LogMessage("システムディレクトリ: " + $system32Path)
$ReAgentXmlPath = Join-Path -Path $system32Path -ChildPath "\Recovery\ReAgent.xml"
LogMessage("ReAgent xml: " + $ReAgentXmlPath)
if (!(Test-Path  $ReAgentXmlPath))
{
	LogMessage("Error: ReAgent.xmlが見つかりません。")
	exit 1
}
# OSパーティションの取得
LogMessage("")
LogMessage(" OS と WinRE のパーティション情報収集...")
$OSDrive = $system32Path.Substring(0,1)
$OSPartition = Get-Partition -DriveLetter $OSDrive
# WinREパーティション取得
$WinRELocationItems = $WinRELocation.Split('\\')
foreach ($item in $WinRELocationItems)
{
    if ($item -like "harddisk*")
	{
		$OSDiskIndex = ExtractNumbers($item)
	}
	if ($item -like "partition*")
	{
		$WinREPartitionIndex = ExtractNumbers($item)
	}
}
LogMessage("OS Disk: " + $OSDiskIndex)
LogMessage("OS Partition: " + $OSPartition.PartitionNumber)
LogMessage("WinRE Partition: " + $WinREPartitionIndex)
$WinREPartition = Get-Partition -DiskNumber $OSDiskIndex -PartitionNumber $WinREPartitionIndex
$diskInfo = Get-Disk -number $OSDiskIndex
$diskType = $diskInfo.PartitionStyle
LogMessage("Disk PartitionStyle: " + $diskType)
# WinREのパーティションサイズを表示する
LogMessage("WinREパーティションサイズ情報")
$WinREPartitionSizeInfo = DisplayPartitionInfo($WinREPartition.AccessPaths)
LogMessage("WinRE パーティションオフセット: " + $WinREPartition.Offset)
LogMessage("WinRE パーティションタイプ: " + $WinREPartition.Type)
LogMessage("OS パーティションサイズ: " + $OSPartition.Size)
LogMessage("OS パーティションオフセット: " + $OSPartition.Offset)
$OSPartitionEnds = $OSPartition.Offset + $OSPartition.Size
LogMessage("OS パーティション終了位置: " + $OSPartitionEnds)
LogMessage("WinRE パーティション開始位置: " + $WinREPartition.Offset)
$WinREIsOnSystemPartition = $false
if ($diskType -ieq "MBR")
{
	if ($WinREPartition.IsActive)
	{
		LogMessage("WinREはシステムパーティションに存在します。")
		$WinREIsOnSystemPartition = $true
	}
}
if ($diskType -ieq "GPT")
{
	if ($WinREPartition.Type -ieq "System")
	{
		LogMessage("WinREはシステムパーティションに存在します。")
		$WinREIsOnSystemPartition = $true
	}
}
# バックアップフォルダーの状態チェック
if ($PSBoundParameters.ContainsKey('BackupFolder'))
{
	LogMessage("")
	LogMessage("バックアップフォルダー: [" + $BackupFolder + "]")
	
	$Needbackup = $true
	
	if ($WinREIsOnSystemPartition)
	{
		$Needbackup = $false
		LogMessage("WinREはシステムパーティションにあるので、バックアップする必要はありません。")
	}
	else
	{
		if (Test-path $BackupFolder)
		{
			$items = Get-ChildItem -Path $BackupFolder
			if ($items)
			{
				LogMessage("エラー: バックアップフォルダーが空ではありません。")
				exit 1
			}
		}
		else
		{
			LogMessage("バックアップフォルダーを作成しています...")
			try 
			{
				$item = New-Item -Path $BackupFolder -ItemType Directory -ErrorAction Stop
				if ($item)
				{
					LogMessage("バックアップフォルダーは作成されました。")
				}
				else
				{
					LogMessage("エラー: バックアップフォルダー作成に失敗しました [" + $BackupFolder + "]")
					exit 1
				}
			} catch 
			{
				LogMessage("エラー: エラーが発生しました: $_")
				exit 1
			}
		}
	}
}
# ------------------------------------
# 実行要件を満たしているか検証
# - WinREはOSのパーティションに置くことはできません
# - WinREパーティションはOSパーティションの次のパーティションでなければなりません
# - WinREパーティションにすでに250MB以上の空き領域がある場合、パーティションの再割り当てを行う必要はありません
# - WinREパーティションサイズを大きくするのに十分な未割り当て領域がある場合は、OSの縮小をスキップします
# 
# しかし、WinREパーティションがOSパーティションより前にある場合、それを拡張できません
# そのため、OSパーティションの後に新しいWinREパーティションを作成したほうがよいでしょう
# ------------------------------------
# いくつかのチェックを行う
LogMessage("")
LogMessage("WinREパーティションの拡張が必要かどうかの確認...")
if (!(($diskType -ieq "MBR") -Or ($diskType -ieq "GPT")))
{
	LogMessage("エラー: 予期せぬディスク・パーティション・スタイル: " +$diskType)
	exit 1
}
# WinREパーティションはOSパーティションの後になければなりません
if ($WinREPartitionIndex -eq $OSPartition.PartitionNumber)
{
	LogMessage("WinREとOSは同じパーティションにあるため、拡張は行いません。")
	exit 0
}
$supportedSize = Get-PartitionSupportedSize -DriveLetter $OSDrive
# 十分な空き領域がある場合は、拡張をスキップする
if ($WinREPartitionSizeInfo[1] -ge 250MB)
{
	LogMessage("WinREパーティションに250MB以上の空き容量が検出されました。")
	exit 0
}
if ($WinREPartition.Offset -lt $OSPartitionEnds)
{
	LogMessage("WinREパーティションがOSパーティションの後にないため、拡張ができません。")
	LogMessage("OSパーティションの後に新しいWinREパーティションを作成する必要があります。")
	$NeedCreateNew = $true
	$NeedShrink = $true
	
	# 再パーティションのサイズを計算する 
	# 現在のWinREパーティションサイズ＋250MBで新しいWinREパーティションを作成します
	# OSパーティションサイズは新しいWinREパーティションサイズによって縮小されます
	$targetWinREPartitionSize = $WinREPartitionSizeInfo[0] + 250MB
	$shrinkSize = [Math]::Ceiling($targetWinREPartitionSize / 1MB) * 1MB
	$targetOSPartitionSize = $OSPartition.Size - $shrinkSize
	if ($targetOSPartitionSize -lt $supportedSize.SizeMin)
	{
		LogMessage("エラー: 縮小後のターゲットOSのパーティションサイズがサポートされている最小サイズより小さいため、再パーティションを実行できません。")
		exit 1
	}
}
else
{
	if ($WinREIsOnSystemPartition)
	{
		LogMessage("WinREパーティションはOSパーティションの後にあり、システムパーティションでもあります。")
		LogMessage("エラー: 予期しないディスクレイアウトが発生しました。")
		exit 1
	}
	if (!($WinREPartitionIndex -eq ($OSPartition.PartitionNumber + 1)))
	{
		LogMessage("エラー: WinREパーティションがOSパーティションの直後になく、WinREパーティションを拡張できません。")
		exit 1
	}
	# 再パーティションのサイズを計算する
	# OSのパーティションを250MB縮小
	$shrinkSize = 250MB
	$targetOSPartitionSize = $OSPartition.Size - $shrinkSize
	$targetWinREPartitionSize = $WinREPartitionSizeInfo[0] + 250MB
	$UnallocatedSpace = $WinREPartition.Offset - $OSPartitionEnds;
	# 未割り当て領域がある場合は、その領域の使用を検討する
	if ($UnallocatedSpace -ge 250MB)
	{
		$UnallocatedSpace = $WinREPartition.Offset - $OSPartitionEnds;
		LogMessage("OSとWinREパーティションの間に未割り当ての領域が見つかりました: " + $UnallocatedSpace)
		LogMessage("OSパーティションを縮小しなくても、WinREパーティションを拡張するのに十分なスペースがすでにあります。")
		$NeedShrink = $false
		$targetOSPartitionSize = 0
	}
	else
	{
		$shrinkSize = [Math]::Ceiling((250MB - $UnallocatedSpace)/ 1MB) * 1MB
		if ($shrinkSize > 250MB)
		{
			$shrinkSize = 250MB
		}
		$targetOSPartitionSize = $OSPartition.Size - $shrinkSize
		if ($targetOSPartitionSize -lt $supportedSize.SizeMin)
		{
			LogMessage("エラー: 縮小後のターゲットOSのパーティションサイズがサポートされている最小サイズより小さいため、再パーティションを実行できません。")
			exit 1
		}
	}
}
# ------------------------------------
# 実行計画を報告し、続行するためにユーザーに確認を求める
# ------------------------------------
# 実行予定の変更を報告し、ユーザーの確認を待つ
LogMessage("")
LogMessage("変更案の概要")
if ($NeedCreateNew)
{
	LogMessage("注：WinREパーティションはOSパーティションの前にあり、OSパーティションの後に新しいWinREパーティションを作成する必要があります。")
	LogMessage("OSパーティションを" + $shrinkSize + "縮小します。")
	LogMessage("  現在のOSパーティションサイズ: " + $OSPartition.Size)
	LogMessage("  縮小後のOSパーティションサイズ: " + $targetOSPartitionSize)
	LogMessage("新しいWinREパーティションが作成されます。: ", $targetWinREPartitionSize)
	if ($WinREIsOnSystemPartition)
	{
		LogMessage("既存のWinREパーティションはシステムパーティションでもあり、保存されます。")
	}
	else
	{
		LogMessage("既存のWinREパーティションは削除されます。")
		LogMessage("  WinRE パーティション: ディスク [" + $OSDiskIndex + "] パーティション [" + $WinREPartitionIndex + "]")
		LogMessage("  現在のWinREパーティションサイズ: " + $WinREPartitionSizeInfo[0])
	}
}
else
{
	if ($NeedShrink)
	{
		LogMessage("OSパーティションを" + $shrinkSize + "縮小します。")
		LogMessage("  現在のOSパーティションサイズ: " + $OSPartition.Size)
		LogMessage("  縮小後のOSパーティションサイズ: " + $targetOSPartitionSize)
		if ($UnallocatedSpace -ge 0)
		{
			LogMessage("OSパーティションとWinREパーティションの間の未割り当て領域: " + $UnallocatedSpace)
		}
	}
	else
	{
		LogMessage("OSとWinREパーティションの間の未割り当て領域から250MBを使用sします。")
	}
	LogMessage("WinREのパーティションサイズを250MB拡張します。")
	LogMessage("  WinRE パーティション: ディスク [" + $OSDiskIndex + "] パーティション [" + $WinREPartitionIndex + "]")
	LogMessage("  現在のWinREパーティションサイズ: " + $WinREPartitionSizeInfo[0])
	LogMessage("  新しいWinREパーティションサイズ:     " + $targetWinREPartitionSize)
	LogMessage("WinREはWinREパーティションを拡張する前に一時的に無効になり、最終的に自動的に有効になります。")
	if ($UnallocatedSpace -ge 100MB)
	{
		LogMessage("警告:OSパーティションとWinREパーティションの間に100MB以上の未割り当て領域が検出されました。")
		LogMessage("OSとWinREパーティションの間にある未割り当てのスペースを使って進めますか？")
	}
}
if ($Needbackup)
{
	LogMessage("")
	LogMessage("古いWinREパーティションは [" + $BackupFolder + "]にバックアップされます。")
}
LogMessage("")
LogMessage("このスクリプトを実行する前にデバイスを再起動し、保留中のパーティション操作が確定していることを確認してください。")
LogMessage("")


$userInput = Read-Host -Prompt "続行しますか(Y/N)?"
	
if ($userInput -ieq "Y")
{
	LogMessage("続行します...")
}
elseif ($userInput -ieq "N")
{
	LogMessage("ユーザーからのリクエストに基づきキャンセルします。")
	exit 0
}
else
{
	LogMessage("エラー: Y、N以外が入力されました: [" + $userInput + "]") 
	exit 0
}

LogMessage("")
LogMessage("注：予期せぬ結果を防ぐため、実行を中断したりシステムを再起動したりしないでください。")
# ------------------------------------
# 実際に実行する
# 主な流れは以下の通り:
# 1. ReAgent.xmlにステージの場所があるかどうかを確認し、再作成のためにクリアする
# 2. WinREパーティションが削除されるため、WinREを無効にする
# 3. 再パーティションを実行し、より大きなWinREパーティションを作成する
# 4. WinREの再有効化
# ------------------------------------
LogMessage("")
# ReAgent.xmlを読み込んでステージの場所をクリアする
LogMessage("Loading [" + $ReAgentXmlPath + "] ...")
$xml = [xml](Get-Content -Path $ReAgentXmlPath)
$node = $xml.WindowsRE.ImageLocation
if (($node.path -eq "") -And ($node.guid -eq "{00000000-0000-0000-0000-000000000000}") -And ($node.offset -eq "0") -And ($node.id -eq "0"))
{
	LogMessage("ステージの位置情報は空です")
}
else
{
	LogMessage("ステージの位置情報を消去...")
	$node.path = ""
	$node.offset = "0"
	$node.guid= "{00000000-0000-0000-0000-000000000000}"
	$node.id="0"
	# 変更を保存
	LogMessage("Saving changes to [" + $ReAgentXmlPath + "]...")
	$xml.Save($ReAgentXmlPath)
}
# WinREの無効化
LogMessage("Disabling WinRE...")
reagentc /disable
if (!($LASTEXITCODE -eq 0))
{
	LogMessage("警告: WinREを無効にする際にエラーが発生しました: " + $LASTEXITCODE)
	exit $LASTEXITCODE
}
# WinREがC:\Windows\System32\Recovery\WinRE.wimにあることを確認してください
$disableWinREPath = Join-Path -Path $system32Path -ChildPath "\Recovery\WinRE.wim"
LogMessage("WinRE wimがダウンレベルのデフォルトの場所に存在することを確認する")
if (!(Test-Path $disableWinREPath))
{
	LogMessage("エラー: 見つかりません " + $disableWinREPath)
	
	# WinREの再有効化
	LogMessage("エラー時にWinREを再有効化する...")
	reagentc /enable
	if (!($LASTEXITCODE -eq 0))
	{
		LogMessage("警告: WinREを有効にする際にエラーが発生しました: " + $LASTEXITCODE)
	}
	exit 1
}
# ------------------------------------
# 再パーティションの実行
# 1. OSパーティションのサイズを変更する
# 2. WinREパーティションを削除する
# 3. 新しいWinREパーティションを作成する
# ------------------------------------
LogMessage("WinREパーティションを拡張するために再パーティションを実行します ...")
# 1. OSパーティションのサイズを変更する
if ($NeedShrink)
{
	LogMessage("OSパーティションを縮小し、より大きなWinREパーティションを作ります")
	LogMessage("OSパーティションのサイズ変更: [" + $targetOSPartitionSize + "]...")
	Resize-Partition -DriveLetter $OSDrive -Size $targetOSPartitionSize
	if ($Error.Count -gt 0) {
		LogMessage("エラー: パーティション再作成でエラー: " + $Error[0].Exception.Message)
		
		# WinREの再有効化
		LogMessage("エラー時にWinREを再有効化します...")
		reagentc /enable
		if (!($LASTEXITCODE -eq 0))
		{
			LogMessage("警告: WinREを有効にする際にエラーが発生しました: " + $LASTEXITCODE)
		}
		exit 1
	}
	$OSPartitionAfterShrink = Get-Partition -DriveLetter $OSDrive
	LogMessage("対象パーティションサイズ: " + $targetOSPartitionSize)
	LogMessage("縮小後のOSパーティションサイズ: " + $OSPartitionAfterShrink.Size)
}
# 2. WinREパーティションを削除する
LogMessage("")
if ($WinREIsOnSystemPartition)
{
	LogMessage("既存のWinREパーティションはシステムパーティションです。")
}
else
{	
	# ユーザーからの要求があれば、WinREパーティションの残りのコンテンツをバックアップ・ディレクトリにバックアップする
	if ($Needbackup)
	{
		$sourcePath = $WinREPartition.AccessPaths[0] 
		LogMessage("WinREパーティションのコンテンツを [" + $sourcePath + "] から [" + $BackupFolder + "]にコピー...")
		
		# Copy-Itemは、特定のシステムフォルダへのアクセスに問題がある可能性があるため、子アイテムを列挙し、それらを除外する
		$items = Get-ChildItem -LiteralPath $sourcePath -Force
		foreach ($item in $items)
		{
			if ($item.Name -ieq "System Volume Information")
			{
				continue
			}
			$sourceItemPath = Join-Path -Path $sourcePath -ChildPath $item.Name
			$destItemPath = Join-Path -Path $BackupFolder -ChildPath $item.Name
			try 
			{
				LogMessage("[" + $sourceItemPath + "] から [" + $destItemPath + "]にコピー中...")
				Copy-Item -LiteralPath $sourceItemPath -Destination $destItemPath -Recurse -Force
			} catch 
			{
				LogMessage("エラー: コピー中にエラーが発生しました: $_")
				exit 1
			}
		}
		
		LogMessage("バックアップ完了")
		LogMessage("")
	}
	LogMessage("WinREパーティションの削除: ディスク [" + $OSDiskIndex + "] パーティション [" + $WinREPartitionIndex + "]...")
	Remove-Partition -DiskNumber $OSDiskIndex -PartitionNumber $WinREPartitionIndex -Confirm:$false
	if ($Error.Count -gt 0) {
		LogMessage("エラー: パーティションの削除でエラーが発生: " + $Error[0].Exception.Message)
		exit 1
	}
}
# 仕切り直しの短いスリープ
Sleep 5
# 3. 新しいWinREパーティションを作成する
LogMessage("")
LogMessage("新しいWinREパーティションの作成...")
LogMessage("ターゲットサイズ: " + $targetWinREPartitionSize)
if ($diskType -ieq "GPT")
{
	$partition = New-Partition -DiskNumber $OSDiskIndex -Size $targetWinREPartitionSize -GptType "{de94bba4-06d1-4d40-a16a-bfd50179d6ac}"
	
	$newPartitionIndex = $partition.PartitionNumber
	# パーティションがフォーマットできる状態にあることを確認するための短いスリープ
	Sleep 2
	LogMessage("パーティションのフォーマット...")
	$result = Format-Volume -Partition $partition -FileSystem NTFS -Confirm:$false
	if ($Error.Count -gt 0) {
		LogMessage("エラー: ボリュームのフォーマットでエラーが発生: " + $Error[0].Exception.Message)
		exit 1
	}
}
else
{
	#$partition = New-Partition -DiskNumber $OSDiskIndex -Size $targetWinREPartitionSize -MbrType 0x27
	$targetWinREPartitionSizeInMb = [int]($targetWinREPartitionSize/1MB)
	$diskpartScript = 
@"
select disk $OSDiskIndex
create partition primary size=$targetWinREPartitionSizeInMb id=27
format quick fs=ntfs label="Recovery"
set id=27
"@
	$TempPath = $env:Temp
	$diskpartSciptFile = Join-Path -Path $TempPath -ChildPath "\ExtendWinRE_MBR_PowershellScript.txt"
	
	LogMessage("MBRディスクに回復パーティションを作成するための一時ディスクパートスクリプトを作成していません...")
	LogMessage("一時的なdisppartスクリプト: " + $diskpartSciptFile)
	$diskpartScript | Out-File -FilePath $diskpartSciptFile -Encoding ascii
	
	LogMessage("diskpartスクリプトの実行...")
	try 
	{
		$diskpartOutput = diskpart /s $diskpartSciptFile
		
		if ($diskpartOutput -match "DiskPart successfully") 
		{
			LogMessage("Diskpartスクリプトは成功しました。")
		}
		else
		{
			LogMessage("diskpartスクリプトの実行エラー:" + $diskpartOutput)
			exit 1
		}
		LogMessage("一時的なdiskpartスクリプトファイルの削除...")
		Remove-Item $diskpartSciptFile
	}
	catch 
	{
		LogMessage("diskpartスクリプトの実行エラー: $_")
		exit 1
	}
	
	$vol = Get-Volume -FileSystemLabel "Recovery"
	$newPartitionIndex = (Get-Partition | Where-Object { $_.AccessPaths -contains $vol.Path } ).PartitionNumber
}
if ($Error.Count -gt 0) 
{
	LogMessage("エラー: 新規パーティションでエラーが発生: " + $Error[0].Exception.Message)
	exit 1
}
LogMessage("新しいパーティションのインデックス: " + $newPartitionIndex)
# WinRE再有効化
LogMessage("WinRE再有効化...")
reagentc /enable
if (!($LASTEXITCODE -eq 0))
{
	LogMessage("警告: WinREを有効にする際にエラーが発生しました: " + $LASTEXITCODE)
	exit $LASTEXITCODE
}
# 最後に、WinREのステータスを表示して、WinREが正しく有効になっていることを確認します
LogMessage("")
LogMessage("WinRE情報:")
$FinalWinREStatus = DisplayWinREStatus
$WinREStatus = $FinalWinREStatus[0]
$WinRELocation = $FinalWinREStatus[1]
if (!$WinREStatus)
{
	LogMessage("警告: WinREは無効です。")
}
$WinRELocationItems = $WinRELocation.Split('\\')
foreach ($item in $WinRELocationItems)
{
	if ($item -like "partition*")
	{
		$WinREPartitionIndex = ExtractNumbers($item)
	}
}
LogMessage("WinREパーティションのインデックス: " + $WinREPartitionIndex)
$WinREPartition = Get-Partition -DiskNumber $OSDiskIndex -PartitionNumber $WinREPartitionIndex
$WinREPartitionSizeInfoAfter = DisplayPartitionInfo($WinREPartition.AccessPaths)
LogMessage("")
LogMessage("OS情報:")
$OSPartition = Get-Partition -DriveLetter $OSDrive
LogMessage("OS パーティションサイズ: " + $OSPartition.Size)
LogMessage("OS パーティションオフセット: " + $OSPartition.Offset)
if (!($WinREPartitionIndex -eq $newPartitionIndex))
{
	LogMessage("Warning: WinREはパーティション [" + $WinREPartitionIndex +"]にインストールされている、 新しく作成された回復パーティションは [" + $newPartitionIndex + "]です。")
}
LogMessage("終了時間: $([DateTime]::Now)")
if ($NeedBackup)
{
	LogMessage("")
	LogMessage("古いWinREパーティションの内容は、 [" + $BackupFolder + "]にバックアップされています。")
}
LogMessage("")
LogMessage("作業は成功しました。")

```


# 追記

このエラーの発生原因の更新プログラムが配信されなくなったので、
このエラーは発生することがなくなりました。
ですが、脆弱性が解消されたわけではないので、
気になる方は手動で実行してください。

https://www.say-tech.co.jp/contents/blog/yamanxworld/2024vol001