かつて山市良と呼ばれたおじさんのブログ

セイテクエンジニアのブログ  かつて山市良と呼ばれたおじさんのブログ  vol.11 回復パーティションの詳細情報をスクリプトで取得する

 

 

vol.11 回復パーティションの詳細情報をスクリプトで取得する

2024年05月20日配信
2025年04月25日更新
執筆者:山内 和朗

 前回は、回復パーティションのサイズを拡張できる、Microsoft提供のサンプルスクリプト「Resize_Script.ps1」を試してみました。このサンプルを活用すれば、回復パーティションの情報取得に大いに役立ちそうです。今回はこのサンプルを大胆に頂くつもりです。

 

「Resize_Script.ps1」が収集する情報

 

 vol.8vol.9で取り上げたPowerShellスクリプトのサンプルは、今年初めてのWindows Updateの更新プログラムリリース日と同じ2024年1月9日(米国時間)にMicrosoftが公開したものです。このサンプルスクリプトによるWinREのオフラインパッチを自動化ソリューションとして、一部のWindows 10/11バージョンとWindows Server 2022にWinREのセキュリティ更新プログラムをリリースし、それが回復パーティションの空き容量不足が原因でエラーで失敗するという問題を多発させました。

 MicrosoftがWinRE更新エラー問題の多発を受ける形で公開した、以下のドキュメントで公開されているPowerShellスクリプトのサンプル「Resize_Script.ps1」は、パーティションの複雑な操作を支援するものですが、このサンプルからは、回復パーティションのボリューム情報(パーティションサイズや空き容量)、WinREイメージの情報を取得に応用できるテクニックがいろいろと見つかりそうです(画面1)。

Windows RE に更新プログラム パッケージを追加する|Windows REのパーティションを拡張する
https://learn.microsoft.com/ja-jp/windows-hardware/manufacture/desktop/add-update-to-winre#extend-the-windows-re-partition

画面1
画面1 「Resize_script.ps1」は、WinREの情報に加え、OSパーティションと回復パーティションの詳細情報を取得している(前回の実行結果より)

 

今回はほとんど丸ごと頂きます

 

 今回はサンプルスクリプトのコードの一部を拝借するのではなく、[Y/N]でスクリプトの実行を続行(パーティションの操作を実施)する手前までのコードを大胆に丸ごと頂きたいと思います。なぜなら、WinREの状態と場所、OSパーティションとWinREパーティションの空き領域、回復パーティションを拡張可能か(回復パーティションに250MBの空き領域があるかどうか、OSパーティションの次の位置に回復パーティションが配置されているかどうか)など、拡張した場合の現在の回復パーティションの扱い(削除するか、残すか≪システムパーティション兼用の場合≫どうか)など、有益な情報を出力してくれるからです。

 まず、「Resize_script.ps1」を「get-winreinfo.ps1」というファイル名でコピーし、最上部にある静的パラメーター(関数で常に使用できるパラメーター)を受け取る部分の「Param()」のスクリプトブロック(最初の4行)を削除します(画面2)。これにより、パラメーターなしで実行できるスクリプトにします。

 

画面2
画面2 最初の「Param()」のスクリプトブロック(4行)を削除する

 次に、[Y/N]でスクリプトの実行を続行を問い合わせる直前にある「if ($Needbackup)」の行から(BackupFolderパラメーターを受け取っていないためここから)、スクリプトの最後までをすべて削除します。

画面3

画面3 「if ($Needbackup)」の行からスクリプトの最後まで削除する

 さらに、Windows PowerShell(powershell.exe)だけでなく、PowerShell(pwsh.exe)での実行も想定したエラー対策を2つ講じます。1つは、「$WinRELocationItems = $WinRELocation.Split('¥¥')」を「$WinRELocationItems = $WinRELocation -Split '¥¥'」(注:は半角)に置換することです(画面4)。もう1つは、「Get-WmiObject」を「Get-CimInstance」に置換することです。その必要性については、前回までのブログをご覧ください(画面5)。

 

画面4
画面4 PowerShell(pwsh.exe)ではエラーとなる不適切な「split()」メソッドの使い方を、「-Split」オペレーター(演算子)に置換する

 

画面5
画面5 非推奨であり、WindowsのバージョンによってはPowerShell(pwsh.exe)で機能しない「Get-WmiObject」を、「Get-CimInstance」に置換する

 以上で、サンプルスクリプト「Resize_Script.ps1」の、情報取得専用バージョン「get-winreinfo.ps1」が完成しました。Windows PowerShell(powershell.exe)またはPowerShell(pwsh.exe)を管理者として開き、スクリプトを保存したカレントディレクトリ(この例ではC:¥Work)で次のように実行すれば、WinREの状態や、OSおよびWinREパーティションの情報を取得することができます。

PS C:¥Work> .\get-winreinfo.ps1

 

いろんなシステム構成で試してみた

 

 画面6は、このサンプルスクリプトをWindows 11上のPowerShell(pwsh.exe)で実行したときの出力結果です。WinREを一時的に無効にして、WinREが無効になっている場合の出力も確認しました。画面7は、Windows Server 2019のWindows PowerShell(powershell.exe)で実行したときの出力結果です。そして、画面8はBIOS/MBRベースのWindows Server 2012(x86)のWindows PowerShell(powershell.exe)で実行したときの出力結果です。このように、異なるさまざまなシステム構成から期待通りに情報を取得できています。

 

画面6
画面6 Windows 11上のPowerShell(pwsh.exe)で実行したときの出力結果と、WinREが無効な場合の出力結果

 

画面7
画面7 Windows Server 2019の場合の出力結果。回復パーティションを拡張するには、OSパーティションの後ろに新たに作成する必要があることがわかる(その場合、現在の回復パーティションは削除できる)

 

画面8
画面8 Windows Server 2012(x86)の場合の出力結果。回復パーティションを拡張するにはOSパーティションの後ろに作成する必要があるが、現在のWinREを含むパーティションはシステムパーティションでもあるため、そのまま保持される必要があることがわかる

 このサンプルスクリプト(およびその元になった「Resize_Script.ps1」)は、回復パーティションの空き領域のしきい値を250MBで判断していますが、これまで指摘してきたように、WinREの更新は100MB程度の空き領域があれば充分です。このスクリプトを応用すれば、例えば、空き領域が250MBで注意、100MBで警告のように監視するのに使えます。例えば、スクリプトの最後に次の1行を追加すれば、スクリプトの返り値として回復パーティションの空き領域(バイト数)を取得することができます。

 

Return($WinREPartitionSizeInfo[1])

 

 なお、WinREが有効/無効の状態は、スクリプトの終了コード($LastExitCodeまたは$?)で判断できます。終了コードが「0またはTrue」ならWinREは有効、「1またはFalse」ならWinREが無効またはその他のエラーでスクリプトが終了したことを示しています。 例えば、次のように実行することで、回復パーティションの空き容量をしきい値(250MBと100MB)で監視することができます(画面9)。

PS C:¥Work> $freespace = .\get-winreinfo.ps1
if ($LastExitCode -eq 0) {
  Write-Host "WinRE: Enabled"
    Write-Host -NoNewLine "Free Space: "
  if (-not $freespace) {
    Write-Host "unkown"
  } else {
    Write-Host -NoNewLine "Free Space: "
      if ($freespace -gt 250*1024*1024) {
         Write-Host "Healthy (>=250MB)"
      } elseif ($freespace -ge 100*1024*1024) {
         Write-Host "Warning (<250MB)"
      } else {
         Write-Host "Insufficient (<100MB)"
      }
  }
} else {
  Write-Host "WinRE: Disabled or unknown status"
}

 

画面9

画面9 「get-winreinfo.ps1」を応用して、回復パーティションの空き容量のしきい値監視ツールとして使用

 

 最後に、ドライブ文字の割り当ての有無に関係なく、すべてのボリューム情報は、Get-Volumeコマンドレットで取得することができ、ドライブ文字(DriveLetter)、ボリューム名(FriendlyName)、ファイルシステム(FileSystemType)、ドライブの種類(DriveType)、ヘルス状態(HealthStatus)、サイズ(Size)、空き領域(SizeRemaining)などの情報を簡単に取得することができることを付け加えておきます。しかし、今回のサンプルスクリプトとは異なり、Get-Volumeコマンドレットでは、WinREが有効/無効の状態、WinREがセットアップされている場所(回復パーティションの場合もあるし、システムパーティションと兼用の場合もあるし、C:ドライブの場合もある)までは判断することができません。

blog_yamanxworld_subscribe

blog_yamanxworld_comment

blog_yamanxworld_WP_ws2025

最新記事