スタートメニューや設定が表示できない(コマンドは理解して使いましょう) | Windows Tips

スタートメニューや設定が表示できない(コマンドは理解して使いましょう) | Windows Tips




Windows10のスタートメニューが表示できないという現象に遭遇したので、Webで調べたところかなりの数の同じ回答が返ってきました。
結論としてはその手順をやってみてもダメだったのでOS初期化したのですが、「コマンドプロンプトやPowerShellのコマンドが並んでいるが、そもそも何やっているんだ?」と思って、もう一歩踏み込んで調べてみました。

対象となる現象と対処方法

現象

実際に発生していた現象は以下の通りです。

・スタートボタンを押してもメニューが出ない。
・Cortanaの検索結果で表示されたアプリが起動しない(「ファイル名を指定して実行」からはいける)
・デスクトップで右クリックして「個人用設定」を開こうとすると以下のエラーになる。
 ms-settings:personalization-background
 指定されたファイルに対してこの操作を行うプログラムが関連付けられていません。
 プログラムをインストールするか、既にプログラムがインストールされている場合は
 コントロールパネルの[既定のプログラム]でプログラムを関連付けてください。

ちなみにEdgeは試していません。というか何それどこにあんの。

行った対処方法

実施した対処法を簡単に記載します。

1.コマンドプロンプトを管理者モードで起動する


スタートメニューも出ないしCortanaでも呼べなかったので、エクスプローラーでプログラム(C:\windows\system32\cmd.exe)を直接右クリック→「管理者として実行」で立ち上げました。

2.以下コマンドを実行。

>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起動して実行でもいいですが、色々動かなくて面倒だったので起動したコマンドプロンプト上で全部終わらせてしまいました。

結果

dism:異常なし
sfc:異常なし
Get-AppX~:エラーを吐かれた

ちなみに吐かれたエラーはこんなかんじでした。

挙動としてはスタートメニューは復活したけど「設定」が表示できなかったり、Cortanaも相変わらずでした。

ちなみに同様の現象について「CSSEmerg67758.diagcabで直った」とか「startmenu.diagcabで直った」という情報もありましたが、どちらも対応するWindowsUpdateが提供されたので提供終了しています。

ということはWindowsUpdateが全部あてればなおるのではと思いましたが、残念ながら「設定」が開けないのでWindowsUpdateの手動実行に辿り着けません。

個人的な原因追及への好奇心もありましたし、設定以外からのWindowsUpdateの実行の調査なども考えましたが、誠に残念ながらこれは業務であり、早期復旧が最優先。
迷宮入りの前に初期化して復旧に至りました。

感想:「みんなこの説明だけでよくコマンド実行できるよな」

各所に記載されていた対処方法は、上記「行った対処方法」を噛んで含んで丁寧に載せてくださってはいましたが、あくまで「手順」を説明していただけで、本質的には上記の記載と変わりません。

上記の手順だけ提示されているブログなどを見て、「みんなこの説明だけでよくコマンド実行できるよな」と感じざるをえませんでした。

仕事柄コマンドプロンプトは長年触ってきていたので「SFC」や「DISM」は概ね何のことかわかりましたが、PowerShellのコマンドはあまりよくわからなかったので調べてみたところ、コマンドリファレンスだけではなくUWPという仕組みの理解が必要でした。

「これをやったら直るのでやってみてください」と言われて、言われた手順通りやってみることは場合によっては大切です。
言われた手順通りにやってもないのに「できなかった」と言い出す輩はごまんといます。
ただしこれは手順を示している相手が信頼に値する、あるいは問題が発生した場合に手順を示した相手に対応してもらえる場合に限ります。
ネットの情報配信者は最終的な責任は取ってくれません。

コマンドやプログラムの実行は、実行した本人がその実行結果が誤っていた場合にリカバリできる、もしくはリカバリを依頼できる担保が取れていることが必要です。

そのコマンドを実行すると何が行われるのか。
実行結果はどのように確認できるのか。
実行結果がNGだった場合に実行前の状態に戻せるか、戻す必要があるか。

それらをクリアせずにコマンドを実行することにはやはり抵抗があります。
ということで各コマンドをいちいち説明していきたいと思います。

スポンサーリンク

実行したコマンドの解説

dism /online /cleanup-image /restorehealth

やっていること

DISMという仕組みを使って、システムの破損個所を検出・修正する。

実行しているプログラム:DISM

「展開イメージのサービスと管理ツール」というWidowsのプログラムです。
Windowsイメージの破損を検出して修復してくれるツールです。

各引数

/Online

実行中のコンピューターを対象にします。
実行中のコンピューター以外には「オフラインのWindowsイメージ」を対象にできます。

「オフラインのWindowsイメージ」とは、同一の設定にしたクライアントPCを複数台作る場合などに利用される展開用のイメージのこと。
用途や業務によっては100台200台のパソコンを同一設定で一気にセットアップということもあります。
そうした時には展開したい設定を行った1台のパソコンのイメージをツールで抜き取って他のパソコンに配賦する、という方法がとられます。
「オフラインのWindowsイメージ」はその時に抜き取られるイメージのことと思ってください。

オフラインのWindowsイメージに対してもこのコマンドは実行できるため、明示的に「オフラインのイメージじゃなくて今使ってる(オンライン)の方ですよ、と宣言しているのがこの引数です。

/cleanup-image

クリーンアップおよび回復の操作を行います。
DISMは破損の回復だけのだめのコマンドではありません。
OSのアンインストールや既定のアプリケーションの関連付け、アプリパッケージの追加・削除など、ありとあらゆるシステム操作が可能です。

オフラインイメージは通常のパソコンのように設定画面やアプリインストールを画面から行うことができないため、こうしたコマンドが用意されており、それと同じことが今使っているコンピューターに対してもできる、という仕組みです。

/restorehealth

破損の有無の確認と修復を行います。
他のオプションでは、破損の有無を確認するだけだったり、不要なコンポーネントの削除などが可能です。

DISMは多用途で使い方を間違えると結構危険

今回実行したコマンドだけを実行して問題が発生することはあまり考えられないかもしれませんが、DISM自体は引数によって様々な動きをするプログラムです。
仮に利用する場合はコマンドは手打ちせず、コピペで使ったほうが良いでしょう。

sfc /scannow

やっていること

SFCという仕組みを使って、システムファイルのバージョン違いや不整合を検出・修正する。

実行しているプログラム:SFC

SFCとは「システムファイルチェッカー」というプログラムです。
Windowsシステムファイルのバージョン違いやファイル不整合を検出して修復してくれるツールでDISMより前から利用されています。
DISMがWindowsUpdateから修復ファイルを取得してくるのに対して、sfcはインストールメディアやキャッシュから取得します。
動作に違いもあるのでどちらも問題があった場合はDISMとSFCの両方を実行してみます。

引数

/scannow

直ちにスキャンして、不整合などがあった場合は正しいファイルに置き換える。
他には「次回起動時に実行」や「コンピューターが起動するたびに実行」などがある。

まあまあ時間がかかります

SFCはDISMより若干時間がかかります(15~30分くらい)。
システムリソースへの負荷はそこまで大きくないですが、時間的余裕をもって見守ってあげてください。

PowerShellコマンドとUWP

実行しているコマンドを3つに分解する

PowerShellのコマンドはパイプによって次の関数へ引数を渡すことができるため、1つのコマンドの中で実際は3つの処理が行われています。

1.Get-AppXPackage -AllUsers
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」で実行してもエラーが発生したものがあったり、「設定」ピンポイントでは無く他の機能でも対応が必要かもしれなかったことを考えると、結局初期化が最短ルートだったのではないかと思っています。

発生している状況によって対応は変わるので、初期化が絶対正解ということもありません。
しかし上記の仕組みを理解した上で、「何が壊れていて、何を直せばいいか」を明確にすることが困難な場合は、どの時点で初期化を決断するかというジャッジのポイントを持っておくべきでしょう。

PC・スマデバカテゴリの最新記事