わすれなぐさ

自称情報ブログ・備忘録

カテゴリ: PC

msiexec.exeに/norestartオプションを指定しているにもかかわらず再起動してしまう問題があるようです。Google検索で「msiexec norestart」と入力すると「doesn't work」とサジェストが出て来るので、それなりに多く起こっているのだと思います。

具体的な話

筆者はSurface Pro 4とSurface ProにWindows 10をクリーンインストールして展開する際に、公式サイトから入手したドライバーとファームウェアのインストーラ(.msi)をmsiexecコマンドでサイレントインストールしていました。具体的には次のようなコマンドです。
  • start /wait msiexec /i <msiファイル> /quiet /norestart

しかし、このコマンドの実行が終わると「サインアウトしようとしています」と画面に表示されて、1分以内(おそらく30秒)で再起動してしまう問題が起こっていました。

私の場合は30秒経つ前にバッチファイルでshutdown /r /t 0のコマンドが動くようになっているので、そちらで再起動がかかるのですが、厄介なのは、再起動した直後にもう一度「サインアウトしようとしています」と表示されて再起動がかかってしまうところです。残留思念みたいな挙動やめてほしいです。

勝手な再起動に留まらず、最近はmsiファイルのインストールが完了していないのにコマンドが終了し、再起動してしまう問題まで起こるようになりました。これは、展開するWindows 10のバージョンを1709から1803に変更したSurface Proでのみ発生するようになった問題です。理由は不明ですが、同様に1803にしたSurface Pro 4では発生しませんでした。

結局のところ、筆者は/norestartオプションを外す(あるいは/forcerestartに変更する)ことで、これらの問題に対処しました。もしかすると、/quietオプションやstart /waitコマンドが悪さをしていたのかもしれませんが、その点は検証していないため不明です。

Windows 10 Pro/Enterpriseで、コマンドプロンプトやバッチファイルを使ってWindows Updateを延期する方法です。通常であれば、設定→更新とセキュリティ→Windows Update→詳細オプションから延期の設定を行えますが、本記事ではコマンドでレジストリを操作する方法を紹介します。検証した環境はWindows 10 Pro 1803および1809です。

コマンド

Windows Updateの延期関係の設定は、レジストリの次の場所にあります。
  • HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings

ブランチ準備レベルを変更するには、BranchReadinessLevelのデータを16(半期チャネル(対象指定))または32(半期チャネル)にします。機能更新プログラムおよび品質更新プログラムを延期するには、それぞれDeferFeatureUpdatesPeriodInDaysおよびDeferQualityUpdatesPeriodInDaysのデータを延期したい日数(1~365)にします。

この変更をコマンドで行うには、regコマンドを使用します。例えば、機能更新プログラムを60日延期する場合は、次のコマンドを実行します。
  • reg add HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings /v DeferFeatureUpdatesPeriodInDays /t REG_DWORD /d 60 /f

コマンドのオプションについての詳細は、コマンドプロンプトでreg add /?と入力してください。

ユーザーがクリックするとWindows 10の「設定」を開くことができるリンクテキストを記述する方法です。

方法

次のように記述します。
<a href="ms-settings:">設定を開く</a>

すると、このようになります。
設定を開く

他にも、"ms-settings:" の部分を "ms-settings:about" に変更するとバージョン情報が開けたり、"ms-settings:windowsupdate" にするとWindows Updateが開けたりします。他にもいくつかあるようですが、詳しくは下記の参考をご覧ください。

参考

ポインタの混乱を防ぎたいメモ。

ポインタ変数とは

ポインタ変数は、普通の変数と同じく、何らかの文字に数値を格納しているものです。ただし、格納しているのがアドレスであるというのが、普通の変数とは異なる特徴です。

ここで、アドレスとは住所のことです。よく変数が箱に例えられますが、その箱には住所も割り当てられているということです。

& と *

アンパサンド(&)とアスタリスク(*)の意味を説明します。以下、普通の変数を a、ポインタ変数を p としています。

意味
&a a のアドレス
*p アドレス p に格納されている値

アドレスを見る 値を見る
&a a
p *p

& と * は、お互いに逆の意味を持ってる感じですね。

ポインタに変数のアドレスを代入するときは、
 p = &a;
と書きます。こうすることにより、*p == a になります。

宣言

変数を宣言するときは、
 int a;
のようにしますが、ポインタ変数を宣言するときは、
 int* p;
とします。ポインタの型は、アドレスを代入する変数の型に合わせます。型の後に * を付けることで、次の変数が普通の変数ではなくポインタ変数だということを示しています。

気を付けてほしいのは、この * が、先程述べた * とは違うものだということです。そのことを理解しておくと、ポインタの混乱が減らせると思います。

配列

配列 data[] があるとすると、配列の先頭アドレスは data と書くだけで表現できます。これは &data[0] と同じ意味になります。

まとめ

宣言 アドレスを見る 値を見る
int a; &a a
int* p; p *p
int data[10]; data data[0]

補足1:ポインタのサイズと型

ポインタ変数に格納される値は、他の変数の先頭1バイトのアドレスであり、アドレスのサイズは常に4バイトです(32ビット環境)。

ポインタの型は、ポインタ自身のサイズを決めるのではなく、ポインタが指す変数の型を表します。

ポインタの型の違いが顕著に見られるのは、アドレス演算のときです。char* 型のポインタ cp を cp++; すると cp の値が1増えますが、int* 型のポインタ ip を ip++; すると ip の値が4増えます。char のサイズが1バイト、int のサイズが4バイトだからです。

補足2:ポインタの宣言の書き方

ポインタの宣言は、
 int *p;
 int* p;
 int * p;
と、人によって書き方が異なります。昔の人は int *p; と書くことが多く、教科書でもよく見かけますが、この書き方は値を参照するときの *p と混同して入門者が混乱する原因になっているんじゃないかと思います。また、
 int *p = &a;
と書いたとき、実際に行われる代入は
 p = &a;
であるのに、*p に &a が代入されるように見えてしまうのもイマイチです。このことは、関数の引数にポインタを使うときにも同じことが言えます。

そんなような理由で、int* p; と書くほうが見た感じ分かりやすいのでオススメです。ただし欠点もあって、
 int* a, b;
と書いたとき、この意味は
 int* a;
 int b;
になってしまうので、その点にだけ気を付ける必要があります。

参考文献

Windows 10の更新プログラム(Windows Update)が何度も失敗し、繰り返してしまうような状況に陥ることがあります。そんなときは、だいたい以下の方法で解決できる気がします。

大型アップデート(機能更新)に失敗するとき

① メディア作成ツールを使って、Windows 10のインストール用USBメモリを作成します。(詳しい作成方法は検索してください)
Windows 10 のダウンロード

② 作成したUSBメモリをPCに挿し、USBメモリ内のsetup.exeをダブルクリックして実行します。後は画面の指示に従ってください。

累積更新プログラムに失敗するとき

i) 未適用の大型アップデートがすでに配信されている場合
PCのWindows 10のバージョンが最新でない場合は、累積更新プログラムを無視して大型アップデートを適用してしまえばいいと思います。手順は上記の通りです。

ii) そうでない場合
適用可能な大型アップデートが無い場合は、オフラインインストーラーを使って累積更新プログラムを適用します。

① Microsoft Update Catalogで、失敗する更新プログラムを検索します。(検索する際は、KB番号で検索するのが一番確実ですが、分からなければ自分の環境に適合するキーワードで検索することもできます。例:「x64 windows 10 1709 累積更新」)
Microsoft Update カタログ

② 目的の更新プログラムを見つけたら、右の「ダウンロード」からダウンロードします。

③ ダウンロードしたファイル(.msu)をダブルクリックして実行します。後は画面の指示に従ってください。

このページのトップヘ