Windows10のスタートメニューが表示できないという現象に遭遇したので、Webで調べたところかなりの数の同じ回答が返ってきました。
結論としてはその手順をやってみてもダメだったのでOS初期化したのですが、「コマンドプロンプトやPowerShellのコマンドはそもそも何やっているんだ?」と思い、もう一歩踏み込んで調べてみました。
対象となる現象と対処方法
現象
実際に発生していた現象は以下の通りです。
・Windowsアイコン/ボタンを押下してもスタートメニューが表示されない。
・Cortanaの検索結果からアプリが起動しない。「ファイル名を指定して実行」からは問題なし。
・デスクトップで右クリックして「個人用設定」を開こうとすると以下のエラーになる。
ms-settings:personalization-background
指定されたファイルに対してこの操作を行うプログラムが関連付けられていません。
プログラムをインストールするか、既にプログラムがインストールされている場合は
コントロールパネルの[既定のプログラム]でプログラムを関連付けてください。
行った対処方法
実施した対処法を簡単に記載します。
スタートメニューも出ないしCortanaでも呼べなかったので、エクスプローラーでプログラム(C:\windows\system32\cmd.exe)を直接右クリック→「管理者として実行」で立ち上げました。
>dism /online /cleanup-image /restorehealth
>sfc /scannow
>powershell
>Get-AppXPackage -AllUsers |Where-Object {$.InstallLocation -like “SystemApps”} | Foreach {Add-AppxPackage -DisableDevelopmentMode -Register”$($.InstallLocation)\AppXManifest.xml”}
後半はコマンドプロンプトではなくPowerShellウインドウを起動して実行でもいいですが、色々動かなくて面倒だったので起動したコマンドプロンプト上で全部終わらせてしまいました。
結果
sfc:異常なし
Get-AppX~:エラーを吐かれた
ちなみに吐かれたエラーはこんなかんじでした。
挙動としてはスタートメニューは復活したけど「設定」が表示できなかったり、Cortanaも相変わらずでした。
ちなみに同様の現象について「CSSEmerg67758.diagcabで直った」とか「startmenu.diagcabで直った」という情報もありましたが、どちらも対応するWindowsUpdateが提供されたので提供を終了しています。
ということはWindowsUpdateが全部あてればなおるのではと思いましたが、残念ながら「設定」が開けないのでWindowsUpdateの手動実行に辿り着けません。
個人的な原因追及への好奇心もありWindowsUpdateプログラムを個別で落としてくることも考えましたが、残念ながら「PCの復旧」が業務の目的であり、原因追及にかける時間と復旧のタイムリミットを天秤にかける必要があります。迷宮入りの前にPCを初期化して復旧に至りました。
感想:「みんなこの説明だけでよくコマンド実行できるよな」
各所に記載されていた対処方法は、上記「行った対処方法」を噛んで含んで丁寧に載せてくださってはいましたが、あくまで「手順」を説明していただけで、本質的には上記の記載と変わりません。
上記の手順だけ提示されているブログなどを見て、「みんなこの説明だけでよくコマンド実行できるよな」と感じざるをえませんでした。
仕事柄コマンドプロンプトは長年触ってきていたので「SFC」や「DISM」は概ね何のことかわかりましたが、PowerShellのコマンドはあまりよくわからなかったので調べてみたところ、コマンドリファレンスだけではなくUWPという仕組みの理解が必要でした。
「これをやったら直るのでやってみてください」と言われて言われた手順通りやってみることは、場合によっては大切です。言われた手順通りにやってもないのに「できなかった」と言い出す輩はごまんといます。
ただしこれは手順を示している相手が信頼に値する、あるいは問題が発生した場合に手順を示した相手に対応してもらえる場合に限ります。
ネットの情報配信者は最終的な責任は取ってくれません(その意味では私もそうですが…)。
コマンドやプログラムの実行は、実行した本人がその実行結果が誤っていた場合にリカバリできる、もしくはリカバリを依頼できる担保が取れていることが必要です。
そのコマンドを実行すると何が行われるのか。
実行結果はどのように確認できるのか。
実行結果がNGだった場合に実行前の状態に戻せるか、戻す必要があるか。
それらをクリアせずにコマンドを実行することにはやはり抵抗があります。
ということで各コマンドをいちいち説明していきたいと思います。
実行したコマンドの解説
dism /online /cleanup-image /restorehealth
やっていること
DISMという仕組みを使って、システムの破損個所を検出・修正する。
実行しているプログラム:DISM
「展開イメージのサービスと管理ツール」というWidowsのプログラムです。
Windowsイメージの破損を検出して修復してくれるツールです。
各引数
実行中のコンピューターを対象にします。
実行中のコンピューター以外には「オフラインのWindowsイメージ」を対象にできます。
「オフラインのWindowsイメージ」とは、同一の設定にしたクライアントPCを複数台作る場合などに利用される展開用のイメージのことです。用途や業務によっては100台200台のパソコンを同一設定で一気にセットアップということもあります。
そうした時には展開したい設定を行った1台のパソコンのイメージをツールで抜き取って他のパソコンに配賦する、という方法を取ることができます。
「オフラインのWindowsイメージ」はその時に抜き取られるイメージのことと思ってください。
オフラインのWindowsイメージに対してもこのコマンドは実行できるため、明示的に「オフラインのイメージじゃなくて今使ってる(オンライン)の方ですよ」と宣言しているのがこの引数です。
クリーンアップおよび回復の操作を行います。
DISMは破損の回復だけのだめのコマンドではありません。
OSのアンインストールや既定のアプリケーションの関連付け、アプリパッケージの追加・削除など、ありとあらゆるシステム操作が可能です。
オフラインイメージは通常のパソコンのように設定画面やアプリインストールを画面から行うことができないためこうしたコマンドが用意されており、それと同じことが今使っているコンピューターに対してもできるという仕組みです。
破損の有無の確認と修復を行います。
他のオプションでは、破損の有無を確認するだけだったり、不要なコンポーネントの削除などが可能です。
DISMは多用途で使い方を間違えると結構危険
今回実行したコマンドだけを実行して問題が発生することはあまり考えられないかもしれませんが、DISM自体は引数によって様々な動きをするプログラムです。
仮に利用する場合はコマンドは手打ちせず、コピペで使ったほうが良いでしょう。
sfc /scannow
やっていること
SFCという仕組みを使って、システムファイルのバージョン違いや不整合を検出・修正する。
実行しているプログラム:SFC
SFCとは「システムファイルチェッカー」というプログラムです。
Windowsシステムファイルのバージョン違いやファイル不整合を検出して修復してくれるツールでDISMより前から利用されています。
DISMがWindowsUpdateから修復ファイルを取得してくるのに対して、sfcはインストールメディアやキャッシュから取得します。
動作に違いがあるので問題があった場合はDISMとSFCの両方を実行してみることが多いです。
引数
直ちにスキャンして、不整合などがあった場合は正しいファイルに置き換える。
他には「次回起動時に実行」や「コンピューターが起動するたびに実行」などがある。
まあまあ時間がかかります
SFCはDISMより若干時間がかかります(15~30分くらい)。
システムリソースへの負荷はそこまで大きくないですが、時間的余裕をもって見守ってあげてください。
PowerShellコマンドとUWP
実行しているコマンドを3つに分解する
PowerShellのコマンドはパイプによって次の関数へ引数を渡すことができるため、1つのコマンドの中で実際は3つの処理が行われています。
2.Where-Object {$.InstallLocation -like “SystemApps”}
3.Foreach {Add-AppxPackage -DisableDevelopmentMode -Register “$($.InstallLocation)\AppXManifest.xml”}
Get-AppXPackageとUWP
インストール済みUWP(ユニバーサルWindowsプラットフォーム)アプリケーションの情報を呼び出しています。
UWPとは、異なるデバイス(パソコン、サーバ、スマデバ、Xbox、組み込み等)で共通して展開できるアプリケーションプラットフォームで、UWPで動作するアプリがUWPアプリケーションです。
パソコン、サーバ、スマデバでOSはそれぞれ異なりますが、見た目だけではなくカーネルコードも含めて同じものが動作でき、この仕組みでアプリ開発すればデバイス毎にコードを変えずにアプリが作成できます。
Microsoftも力を入れているのですが、「そうはいっても基本はデスクトップアプリ(Win32APIや.NET Frameworkなどを開発・実行環境とする従来からのアプリケーション)だよね」のような方針を見せたり、なかなか定まらないところもあります。
そもそも利用者側もWindowsのマルチデバイス利用というイメージがまだあまりわかないのもありますが。
そのUWPアプリを管理するのが、「AppXPackage」です。
Get-AppXPackageはインストールされたUWPアプリの情報(名前、インストール場所等)を取得します。
Where-Object {$_.InstallLocation -like “SystemApps”}
「Get-AppXPackage」で取得したUWPアプリの「インストール場所($_.InstallLocation)」を引数として、インストール場所に「SystemApps」を含むものだけに絞っています。
Foreach {Add-AppxPackage -DisableDevelopmentMode -Register “$($.InstallLocation)\AppXManifest.xml”}
「Foreach」は配列にデータが無くなるまでループする処理です。
前述のコマンドで取得できたアプリのインストール場所に「SystemApps」を含むUWPアプリの一覧が無くなるまで処理を行います。
「Add-AppxPackage」はUWPアプリのインストールコマンドで、「-DisableDevelopmentMode -Register」はモードを選択してアプリの再登録する引数です。
「AppXManifest.xml」というのはアプリの設定ファイルと思っておきましょう。
本来UWPアプリはMicrosoftストア(AndroidのGooglePlay、iOSのAppStoreのWindows版)から取得しますが、今回の方法はMicrosoftストアを介さないアプリ(所謂再度ローディング)と同じ手順を踏みます。
インストール済UWPアプリの再登録をしている
総合すると「現在インストールされてるUWPアプリの一覧を取得して、該当する文字列を含むフォルダにインストールされているアプリの再登録を行う」というコマンドでした。
コマンドで根本解決できていたのだろうか
上記コマンドでは「SystemApps」になっていますが、「設定」は「ImmersiveControlPanel」だったのでは、というところに至ったのはパソコンを初期化しながら継続調査をしている時でした。
しかし「SystemApps」で実行してもエラーが発生しており、「設定」ピンポイントでは無く他の機能でも対応が必要かもしれなかったことを考えると、結局初期化が最短ルートだったのではないかと思います。
発生している状況によって対応は変わるので、初期化が絶対正解ということでもありません。
しかし上記の仕組みを理解した上で、「何が壊れていて、何を直せばいいか」を明確にすることが困難な場合は、どの時点で初期化を決断するかジャッジするポイントを持っておくべきでしょう。
この記事が気に入ったら
いいね!をお願いします