Windows のシステム設定を自動化するための覚え書き

仮想マシンだったり、新しく移行した PC だったり、と Windows セットアップ後の各種システム設定を自動化したい。いちいち手で設定するのはだるい。なんとかできないかと思って調べたことと、現時点での結論。

背景

  • コントロールパネル等を手打ちで反映するのがだるすぎる
  • スクリプト一発で反映できたら理想だよね

結論

  • コマンドで制御できるもの → コマンドの使い方を覚えれば自動化できると思う
  • コマンドで制御できないもの → レジストリを直にいじればよいが、どの設定がレジストリのどこに保存されてるか調べないといけないし、レジストリいじっただけでは設定反映されないので微妙

コマンドで制御できないもの

レジストリ に保存されていて、かつ コマンドによる保存をサポートしていない 設定全般。

現時点での結論

  • 保存場所(キーとエントリ)はググれば見つかる
  • レジストリ操作は reg コマンド、あるいは PowerShell の Set-ItemProperty
  • 問題
    • レジストリいじっただけでは システムに反映されない

反映されない、とは?

たとえば下記フォルダオプションのレジストリにて HideFileExt を 0 から 1(隠しファイルを表示→非表示)に変えたとする。エクスプローラー上ですぐさま反映されるかというと、No である。

反映は エクスプローラー自身が(当該レジストリを)再読込しない限り 行われない。フォルダオプションの画面(コントロールパネル)で OK ボタンを押した時に反映されるのは、エクスプローラーがそういう作りになっているから。

反映させるにはどうしたらいい?

再読込させればいい

ただし対象アプリ(たいていはエクスプローラー)が再読込のインタフェースを公開していなければ不可能である。せいぜい プロセスをまるごと殺して、また再起動する ことで無理矢理一から読み込ませる程度か。

restart_exlorer.bat

@echo off
taskkill /f /IM explorer.exe
start "" explorer.exe

ただしこの強引再起動だと「一部のトレイアイコンが表示されなくなる」といった問題が生じる。また、「画面」と「フォルダを開いてるアプリ」全部に再読込処理が走るため重たい。

(参考) レジストリの保存場所の調べ方

たとえばシステムのプロパティ > 詳細設定タブ > パフォーマンスオプション の「パフォーマンスを優先する」のレジストリ保存場所を調べたい場合。

  • 1 日本語で「パフォーマンスを優先する レジストリ」などで検索する
  • 2 見つからない場合、英語で検索する

結論: VisualFXSetting=2 が「パフォーマンスを優先する」の意。

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\VisualEffects]
"VisualFXSetting"=dword:00000002

(参考) フォルダオプション

「隠しファイルを表示」「拡張子を表示」「保護されたファイルを表示」の保存場所。

Windows Registry Editor Version 5.00

[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced]
"Hidden"=dword:00000001
"HideFileExt"=dword:00000000
"ShowSuperHidden"=dword:00000001

参考: registry - Configure Windows Explorer Folder Options through Powershell - Stack Overflow

コマンドで制御できるもの

レジストリ

reg コマンド。

  • reg add/delete/copy で直接操作
  • reg save/load/restore で hiv ファイルベースの import/export
  • reg import/export で reg ファイルベースの import/export

ちなみに hiv と reg の比較は以下。

  • hiv はバイナリファイルだが ACL(権限設定) なども含めて保存する
  • reg はテキストファイル

参考: windows - Difference between "reg save" and "reg export"? - Super User

サービス

sc コマンド。

タスクスケジューラ

schtasks コマンド。

環境変数

ローカルなら set、グローバルなら setx で変更可。

ネットワーク(アダプタ)設定

netsh コマンド。

ファイル操作

  • mkdir フォルダ新規
  • rmdir フォルダ削除
  • del ファイル削除
  • move ファイル移動
  • ren ファイルリネーム

おわりに

本気で自動化するとしたら、

  • sc, netsh など各種コマンドの使い方を覚える
  • 各種コマンドを使って(自分好みの)設定を行うスクリを書く
  • どのシステム設定がレジストリのどこに保存されてるか洗い出す
  • レジストリを(自分好みの設定に)いじるスクリを書く
  • エクスプローラーを再起動するスクリを書く
    • 必須ではない
    • 最悪 Windows を再起動すれば反映されるし

これら全部をやらないといけない。気が遠くなるような作業だ。