はじめに
筆者の下記記事の修正記事です。修正箇所多数のため,元の記事の修正ではなく,新たに記事を書き直すことにしました。
Windows11をレガシー設定に戻すPowerShellスクリプトをささっと作る - Qiita
仕様案(おしながき)
前回の記事に対して,青色の行が新規追加部分です。
- タスクバーを中央揃いから従来通りの左揃えにしたい。
- エクスプローラの詳細表示で行間隔が空き過ぎて間延び感がある。
- ファイルの拡張子を常に表示させたい。
- エクスプローラのコンテキストメニューの階層が深くなって使いにくい。
- タスクバーの検索ボックスを消したい。
- テーマをライトモードにしたい。
- ウィンドウアクティブ時にタイトルバーの色をアクセントカラーにしたい。
- ウィンドウズターミナルがデフォルトになったが,コマンドプロンプトに戻したい。
- コマンドプロンプトでエスケープシーケンスを有効にしたい。
- 検索ボックスで Bing 検索をしない。
- フォルダ種別の自動検出をオフにして高速化したい。
加えて以下の機能を追加・変更しようと思います。
- DWM を再起動する機能を追加したい。
- 上記の実行には管理者権限が必要なため,管理者権限を有しているかどうかのチェック機能を追加する。
- Windows のバージョンチェック方法を変更する。
- その他,スキルが若干向上したのでリファクタリングする。
レジストリ仕様について
レジストリ仕様について下記まとめました。なお,本表はコンパクトにまとめるため PlantUML の表を用いて表記しており,そのままではテキストをコピーできません。必要な場合は直接 Markdown を参照するか,ソースコードを参照してください。
状態遷移マップ
レジストリの状態を下記の4種類に分類しました。レジストリはファイルシステムのような階層構造になっており,レジストリキーはディレクトリとして,その中に格納されている名前と値はファイルのようなものです。キーの中にキーを置くこともできますし,キー自体も値(既定値)を持ちます。
| 状態 | 内容 |
|---|---|
| #NO-KEY | レジストリキーが存在しない場合 |
| #KEY-ONLY | レジストリキーが存在し,名前の指定がない場合 |
| #NO-VAL | レジストリキーが存在し,指定した名前の値が存在しない場合 |
| #VAL | レジストリキーが存在し,指定した名前の値が存在する場合 |
レジストリの変更前後で4×4=16通りの状態遷移があり得る訳ですが,その中で有効なのものは以下の表に示す5つのみとしました。
| 変更前 | |||||
|---|---|---|---|---|---|
| #NO-KEY | #KEY-ONLY | #NO-VAL | #VAL | ||
| 変更後 | #NO-KEY | REMOVE | |||
| #KEY-ONLY | CREATE | ||||
| #NO-VAL | UPDATE | ||||
| その他 | UPDATE | UPDATE | |||
さらに取り得るアクションは以下の3種類としました。#NO-KEY と #KEY-ONLY の間は往復可能ですが,#NO-VAL から #VAL へは一方通行としました。すなわちいったん値が設定されたら削除することはなく,以降は値の変更のみ行うということです。
| アクション | 内容 |
|---|---|
| REMOVE | 指定したレジストリキーを削除する。 |
| CREATE | 指定したレジストリキーの追加,値は既定値とする。 |
| UPDATE | 指定したレジストリキー,指定した名前の値を変更する。 |
さて,PowerShell スクリプトによる実装コードですが,前回の記事では switch 文を二重に呼び出すことで状態遷移を実現していましたが,御覧の通りスカスカの疎行列なので勿体ない感じがしていました。リファクタリング後は一次元の連想配列としてシンプルにまとめました。
$next がその他のとき $null となるため,文字列にすると空文字列 "" となります。
レジストリ構造体
レジストリのデータを効率よく管理するため,下記の構造体を定義しました。このうち,index メンバーはコマンドラインで指定した数値を格納して書き換えられる場合があります。それ以外のメンバーは固定値です。
| メンバー | 内容 |
|---|---|
| key | レジストリキー |
| name | レジストリ名 |
| type | 説明 |
| label | 型 |
| table | 値とメッセージのテーブル |
| index | テーブルのインデクスを与える ※コマンドラインで指定する |
| explorer | エクスプローラー再起動の要否 |
| dwm | DWM 再起動の要否 |
値とメッセージのテーブル構造体の内容を示します。alt は alternative の略で,#NO-KEY, #KEY-ONLY, #NO-VAL などの状態を与えます。
| メンバー | 内容 |
|---|---|
| alt | レジストリ未定義時の状態および既定値を示す |
| val | レジストリ値 |
| msg | メッセージ |
レジストリ構造体の一例を示します。
$TaskBar = @{
key = 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced'
name = 'TaskbarAl'
type = 'DWord'
label = 'タスクバーの配置'
table = @(
@{ alt = $null; val = 0; msg = '左揃え' }
@{ alt = "#NO-VAL"; val = 1; msg = '中央揃え' }
)
index = $null
explorer = $false
dwm = $false
}
レジストリを変更したとき,次のように表示されます。
Windows のバージョン確認
前回の記事では $PSVersionTable.BuildVersion を参照していましたが,これは PowerShell をビルドしたときの Windows のバージョンであり,現在実行中の Windows のバージョンとは限らないため,下記のように変更しました。
function Check-Version {
$info = Get-CimInstance Win32_OperatingSystem
if($info.Version -notmatch '^(\d+)\.(\d+)\.(\d+)') {
Return $false
}
$major = $Matches[1]
$minor = $Matches[2]
$build = $Matches[3]
if($major -eq 10 -and $minor -eq 0 -and $build -ge 22000) {
Return $true
} else {
Return $false
}
}
Windows10 と Windows11 のバージョン情報を以下に示しますが,両者のメジャー番号とマイナー番号は共通のため,ビルド番号でのみ区別がつきます。
| OS | Update | major | minor | build |
|---|---|---|---|---|
| Windows10 | 22H2 | 10 | 0 | 19045 |
| Windows11 | 21H2 | 10 | 0 | 22000 |
| 22H2 | 10 | 0 | 22621 | |
| 23H2 | 10 | 0 | 22631 | |
| 24H2 | 10 | 0 | 26100 | |
| 25H2 | 10 | 0 | 26200 |
管理者権限の確認
DWM の設定を変更した場合,DWM を再起動しないと設定変更が有効になりません。DWM の再起動には管理者権限が必要です。このため管理者権限を有しているかどうか確認する機能を追加しました。とはいっても .NET Framework の機能を呼び出しているだけです。管理者権限を有している場合は $true を返し,そうではない場合 $false を返します。
function Check-Administrator {
$identity = [Security.Principal.WindowsIdentity]::GetCurrent()
$principal = [Security.Principal.WindowsPrincipal]::new($identity)
$admin = [Security.Principal.WindowsBuiltInRole]::Administrator
Return $principal.IsInRole($admin)
}
実装コード
実装コードを以下に示します。※約400行あります。
実装コードはコチラ
Set-StrictMode -Version Latest
#-------------------------------------------------------------------------------
# レジストリ構造体
#
# key: レジストリキー
# name: レジストリ名
# type: 型
# label: 説明
# table: テーブル
# alt: レジストリ未定義時の状態および既定値を示す
# val: レジストリ値
# msg: メッセージ
# index: テーブルのインデクスを与える ※コマンドライン指定
# explorer: エクスプローラー再起動の要否
# dwm: DWM 再起動の要否
#
# ※label および msg は下記のように出力される
#
# 現在の label は「msg」です。
# ⇒ label を「msg」に変更しました。
#-------------------------------------------------------------------------------
$TaskBar = @{
key = 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced'
name = 'TaskbarAl'
type = 'DWord'
label = 'タスクバーの配置'
table = @(
@{ alt = $null; val = 0; msg = '左揃え' }
@{ alt = "#NO-VAL"; val = 1; msg = '中央揃え' }
)
index = $null
explorer = $false
dwm = $false
}
$CompactMode = @{
key = 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced'
name = 'UseCompactMode'
type = 'DWord'
label = 'エクスプローラー'
table = @(
@{ alt = '#NO-VAL'; val = 0; msg = '非コンパクト表示' }
@{ alt = $null; val = 1; msg = 'コンパクト表示' }
)
index = $null
explorer = $false
dwm = $false
}
$HideFileExt = @{
key = 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced'
name = 'HideFileExt'
type = 'DWord'
label = 'ファイルの拡張子'
table = @(
@{ alt = $null; val = 0; msg = '表示' }
@{ alt = $null; val = 1; msg = '非表示' }
)
index = $null
explorer = $true
dwm = $false
}
$ContextMenu = @{
key = 'HKCU:\Software\Classes\CLSID\{86ca1aa0-34aa-4e8b-a509-50c905bae2a2}\InprocServer32'
name = $null
type = $null
label = 'コンテキストメニュー'
table = @(
@{ alt = '#KEY-ONLY'; val = $null; msg = '旧来のスタイル' }
@{ alt = '#NO-KEY'; val = $null; msg = '新しいスタイル' }
)
index = $null
explorer = $true
dwm = $false
}
$SearchBox = @{
key = 'HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Search'
name = 'SearchboxTaskbarMode'
type = 'DWord'
label = '検索ボックス'
table = @(
@{ alt = $null; val = 0; msg = '非表示' }
@{ alt = $null; val = 1; msg = 'アイコン表示' }
@{ alt = $null; val = 2; msg = 'ボックス表示' }
)
index = $null
explorer = $false
dwm = $false
}
$BingSearch = @{
key = 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Search'
name = 'BingSearchEnabled'
type = 'DWord'
label = ' Bing 検索'
table = @(
@{ alt = $null; val = 0; msg = '無効' }
@{ alt = '#NO-VAL'; val = 1; msg = '有効' }
)
index = $null
explorer = $false
dwm = $false
}
$LightTheme = @{
key = 'HKCU:\SOFTWARE\Microsoft\Windows\CurrentVersion\Themes\Personalize'
name = 'AppsUseLightTheme'
type = 'DWord'
label = 'LightTheme'
table = @(
@{ alt = $null; val = 0; msg = 'ダークモード' }
@{ alt = $null; val = 1; msg = 'ライトモード' }
)
index = $null
explorer = $false
dwm = $false
}
$TitleBar = @{
key = 'HKCU:\SOFTWARE\Microsoft\Windows\DWM'
name = 'ColorPrevalence'
type = 'DWord'
label = 'タイトルバーの色'
table = @(
@{ alt = $null; val = 0; msg = 'デフォルト' }
@{ alt = $null; val = 1; msg = 'アクセントカラー' }
)
index = $null
explorer = $false
dwm = $true
}
$Console = @{
key = 'HKCU:\Console\%%Startup'
name = 'DelegationConsole'
type = 'String'
label = 'コンソール'
table = @(
@{ alt = '#NO-VAL'; val = '{00000000-0000-0000-0000-000000000000}'; msg = 'デフォルト' }
@{ alt = $null; val = '{B23D10C0-E52E-411E-9D5B-C09FDF709C7D}'; msg = 'コンソールホスト' }
@{ alt = $null; val = '{2EACA947-7F5F-4CFA-BA87-8F7FBEEFBE69}'; msg = 'ターミナル' }
)
index = $null
explorer = $false
dwm = $false
}
$Terminal = @{
key = 'HKCU:\Console\%%Startup'
name = 'DelegationTerminal'
type = 'String'
label = 'ターミナル'
table = @(
@{ alt = '#NO-VAL'; val = '{00000000-0000-0000-0000-000000000000}'; msg = 'デフォルト' }
@{ alt = $null; val = '{B23D10C0-E52E-411E-9D5B-C09FDF709C7D}'; msg = 'コンソールホスト' }
@{ alt = $null; val = '{E12CFF52-A866-4C77-9A90-F570A7AA2C6B}'; msg = 'ターミナル' }
)
index = $null
explorer = $false
dwm = $false
}
$EscapeSeq = @{
key = 'HKCU:\Console'
name = 'VirtualTerminalLevel'
type = 'DWord'
label = 'エスケープシーケンス'
table = @(
@{ alt = '#NO-VAL'; val = 0; msg = '無効' }
@{ alt = $null; val = 1; msg = '有効' }
)
index = $null
explorer = $false
dwm = $false
}
$FolderType = @{
key = 'HKCU:\Software\Classes\Local Settings\Software\Microsoft\Windows\Shell\Bags\AllFolders\Shell'
name = 'FolderType'
type = 'String'
label = 'フォルダ種別の自動検出'
table = @(
@{ alt = $null; val = 'NotSpecified'; msg = '無効' }
@{ alt = '#NO-VAL'; val = 'Specified'; msg = '有効' }
)
index = $null
explorer = $false
dwm = $false
}
#-------------------------------------------------------------------------------
# 強制リセットフラグ
#-------------------------------------------------------------------------------
$ForceReset = $false
#-------------------------------------------------------------------------------
# リセット要求
#-------------------------------------------------------------------------------
$ResetRequest = @{
explorer = $false
dwm = $false
}
#-------------------------------------------------------------------------------
# ヘルプメッセージ
#-------------------------------------------------------------------------------
function Usage {
Write-Host 'レジストリを書き換えて Windows 11 のデスクトップ設定を変更します。'
Write-Host ''
Write-Host 'Win11Reg(.PS1) (コマンド) ...'
Write-Host ''
Write-Host '<コマンド一覧>'
Write-Host ''
Write-Host ' TaskBar:(n) タスクバーの配置を変更します。'
Write-Host ' (0:左揃え, 1:中央揃え)'
Write-Host 'CompactMode:(n) エクスプローラーのコンパクト表示を変更します。'
Write-Host ' (0:非コンパクト表示, 1:コンパクト表示)'
Write-Host 'HideFileExt:(n) ファイルの拡張子表示を変更します。'
Write-Host ' (0:表示, 1:非表示)'
Write-Host 'ContextMenu:(n) コンテキストメニューのスタイルを変更します。'
Write-Host ' (0:旧来のスタイル, 1:新しいスタイル)'
Write-Host ' SearchBox:(n) 検索ボックスの表示を変更します。'
Write-Host ' (0:非表示, 1:アイコン表示, 2:ボックス表示)'
Write-Host ' BingSearch:(n) Bing検索を変更します。'
Write-Host ' (0:無効, 1:有効)'
Write-Host ' LightTheme:(n) テーマを変更します。'
Write-Host ' (0:ダークモード, 1:ライトモード)'
Write-Host ' TitleBar:(n) タイトルバーの色を変更します。'
Write-Host ' (0:デフォルト, 1:アクセントカラー)'
Write-Host ' Console:(n) コンソールを変更します。'
Write-Host ' (0:デフォルト, 1:コンソールホスト, 2:ターミナル)'
Write-Host ' Terminal:(n) ターミナルを変更します。'
Write-Host ' (0:デフォルト, 1:コンソールホスト, 2:ターミナル)'
Write-Host ' EscapeSeq:(n) エスケープシーケンスを変更します。'
Write-Host ' (0:無効, 1:有効)'
Write-Host ' FolderType:(n) フォルダ種別の自動検出機能を変更します。'
Write-Host ' (0:無効, 1:有効)'
Write-Host ' ForceReset 必要に応じてエクスプロ-ラ / DWM を再起動します。'
Write-Host ' 管理者権限が必要な場合があります。'
Exit -1
}
#-------------------------------------------------------------------------------
# コマンドライン解析
#-------------------------------------------------------------------------------
function Get-CommandLine {
$args = $SCRIPT:ARGS
if($args.Count -eq 0) { Return }
foreach($arg in $args) {
if($arg -match 'TaskBar:(\d+)') { $SCRIPT:TaskBar.index = $Matches[1] }
elseif($arg -match 'CompactMode:(\d+)') { $SCRIPT:CompactMode.index = $Matches[1] }
elseif($arg -match 'HideFileExt:(\d+)') { $SCRIPT:HideFileExt.index = $Matches[1] }
elseif($arg -match 'ContextMenu:(\d+)') { $SCRIPT:ContextMenu.index = $Matches[1] }
elseif($arg -match 'SearchBox:(\d+)') { $SCRIPT:SearchBox.index = $Matches[1] }
elseif($arg -match 'BingSearch:(\d+)') { $SCRIPT:BingSearch.index = $Matches[1] }
elseif($arg -match 'LightTheme:(\d+)') { $SCRIPT:LightTheme.index = $Matches[1] }
elseif($arg -match 'TitleBar:(\d+)') { $SCRIPT:TitleBar.index = $Matches[1] }
elseif($arg -match 'Console:(\d+)') { $SCRIPT:Console.index = $Matches[1] }
elseif($arg -match 'Terminal:(\d+)') { $SCRIPT:Terminal.index = $Matches[1] }
elseif($arg -match 'EscapeSeq:(\d+)') { $SCRIPT:EscapeSeq.index = $Matches[1] }
elseif($arg -match 'FolderType:(\d+)') { $SCRIPT:FolderType.index = $Matches[1] }
elseif($arg -eq 'ForceReset' ) { $SCRIPT:ForceReset = $true }
else {
Usage
}
}
}
#-------------------------------------------------------------------------------
# OS のバージョンチェック
#-------------------------------------------------------------------------------
function Check-Version {
$ver = $PSVersionTable.BuildVersion
if($ver.Major -eq 10 -and $ver.Minor -eq 0 -and $ver.Build -ge 22000) {
Return $true
} else {
Return $false
}
}
#-------------------------------------------------------------------------------
# 管理者権限のチェック
#-------------------------------------------------------------------------------
function Check-Administrator {
$identity = [Security.Principal.WindowsIdentity]::GetCurrent()
$principal = [Security.Principal.WindowsPrincipal]::new($identity)
$admin = [Security.Principal.WindowsBuiltInRole]::Administrator
Return $principal.IsInRole($admin)
}
#-------------------------------------------------------------------------------
# レジストリのチェック
#-------------------------------------------------------------------------------
function Check-Registry($dat) {
#---------------------------------------------------------------------------
# レジストリの取得
#---------------------------------------------------------------------------
if(Test-Path -LiteralPath $dat.key) {
$item = Get-ItemProperty -LiteralPath $dat.key
if($dat.name -eq $null) {
$prev = @{ alt = '#KEY-ONLY'; val = '#NULL' }
} elseif($item.PSobject.Properties.Match($dat.name).Count -gt 0) {
$prev = @{ alt = '#VAL'; val = $item."$($dat.name)" }
} else {
$prev = @{ alt = '#NO-VAL'; val = '#NULL' }
}
} else {
$prev = @{ alt = '#NO-KEY'; val = '#NULL' }
}
#---------------------------------------------------------------------------
# テーブルの検索
#---------------------------------------------------------------------------
for($i = 0; $i -lt $dat.table.length; $i++) {
if($prev.alt -eq $dat.table[$i].alt) { Break }
if($prev.val -eq $dat.table[$i].val) { Break }
}
if($i -ge $dat.table.length) {
Write-Host "レジストリ $($dat.key) の取得に失敗しました!"
Exit -1
}
Write-Host "現在の$($dat.label)は「$($dat.table[$i].msg)」です。"
if($dat.index -eq $null -or $dat.index -eq $i) { Return }
#---------------------------------------------------------------------------
# 状態遷移マップ
#---------------------------------------------------------------------------
$map = @{}
$map['#KEY-ONLY:#NO-KEY'] = 'REMOVE'
$map['#NO-KEY:#KEY-ONLY'] = 'CREATE'
$map['#NO-VAL:'] = 'UPDATE'
$map['#VAL:#NO-VAL'] = 'UPDATE'
$map['#VAL:'] = 'UPDATE'
#---------------------------------------------------------------------------
# レジストリの更新
#---------------------------------------------------------------------------
$next = $dat.table[$dat.index]
switch($map["$($prev.alt):$($next.alt)"]) {
'REMOVE' {
Remove-Item -LiteralPath $dat.key
}
'CREATE' {
New-Item $dat.key -Force | Out-Null
New-ItemProperty -LiteralPath $dat.key -Name '(default)' | Out-Null
}
'UPDATE' {
Set-ItemProperty -LiteralPath $dat.key -Name $dat.name -Value $next.val -Type $dat.type
}
default {
Write-Host 'レジストリの更新に失敗しました!'
Exit -1
}
}
Write-Host -ForegroundColor yellow " ⇒$($dat.label)を「$($next.msg)」に変更しました。"
#---------------------------------------------------------------------------
# 再起動要求
#---------------------------------------------------------------------------
if($dat.explorer) { $SCRIPT:ResetRequest.explorer = $true }
if($dat.dwm) { $SCRIPT:ResetRequest.dwm = $true }
}
#-------------------------------------------------------------------------------
# コマンドライン解析
#-------------------------------------------------------------------------------
Get-CommandLine
#-------------------------------------------------------------------------------
# OS のバージョンチェック
#-------------------------------------------------------------------------------
if(!(Check-Version)) {
Write-Host -ForegroundColor red 'Windows 11 ではありません!'
Exit -1
}
#-------------------------------------------------------------------------------
# レジストリのチェック
#-------------------------------------------------------------------------------
Check-Registry $TaskBar
Check-Registry $CompactMode
Check-Registry $HideFileExt
Check-Registry $ContextMenu
Check-Registry $SearchBox
Check-Registry $BingSearch
Check-Registry $LightTheme
Check-Registry $TitleBar
Check-Registry $Console
Check-Registry $Terminal
Check-Registry $EscapeSeq
Check-Registry $FolderType
#-------------------------------------------------------------------------------
# エクスプローラーの再起動
#-------------------------------------------------------------------------------
if($ResetRequest.explorer) {
if($ForceReset) {
Write-Host -ForegroundColor 'yellow' 'エクスプローラを再起動します。'
Stop-Process -Name 'Explorer' -Force
} else {
Write-Host -ForegroundColor 'red' 'エクスプローラーを再起動して下さい。'
}
}
#-------------------------------------------------------------------------------
# DWM の再起動
#-------------------------------------------------------------------------------
if($ResetRequest.dwm) {
if($ForceReset) {
if(Check-Administrator) {
Write-Host -ForegroundColor 'yellow' 'DWM を再起動します。'
Stop-Process -Name 'DWM' -Force
} else {
Write-Host -ForegroundColor 'red' 'DWM の再起動に必要な管理者権限がありません。'
}
} else {
Write-Host -ForegroundColor 'red' 'DWM を再起動して下さい。'
}
}
バッチファイル
上記の PowerShell スクリプトを呼び出すバッチファイルです。上記の PowerShell スクリプトと同じフォルダに格納してください。下記バッチファイル admin.cmd は管理者権限で実行して下さい。
@echo off
rem ----------------------------------------------------------------------------
rem 管理者権限のチェック
rem ----------------------------------------------------------------------------
openfiles > nul
if errorlevel 1 (
echo %~f0 は管理者権限で実行して下さい!!
pause
exit /b
)
rem ----------------------------------------------------------------------------
rem コンソール関連のレジストリの存在チェック
rem ----------------------------------------------------------------------------
2>NUL reg query "HKCU\Console\%%%%Startup" /s
if errorlevel 1 (
echo レジストリ HKCU\Console\%%%%Startup が見つかりません!!
echo 一度,コマンドプロンプトを起動してから再度実行して下さい。
pause
exit /b
)
rem ----------------------------------------------------------------------------
rem Windows 11 設定の変更
rem ----------------------------------------------------------------------------
powershell -ExecutionPolicy Bypass -File "%~dp0\win11reg.ps1" TaskBar:0 CompactMode:1 HideFileExt:0 ContextMenu:0 SearchBox:0 BingSearch:0 TitleBar:1 Console:1 Terminal:1 EscapeSeq:1 FolderType:0 ForceReset
pause
exit /b
Windows をアップデートした直後,レジストリ HKCU\Console\%%Starup が存在しない場合があるようですが,一度でもコマンドプロンプトを起動すれば作成されます。このため上記のレジストリが存在しない場合は警告を発するだけに留めました。
今後の課題
無秩序に機能を増やし過ぎたせいか,作った本人なのにコマンドを覚えられません。
- 公式のヘルプ構文に従って書き直したほうがいいか?
- いっそ GUI 化するか?
参考文献
- Windows11のコンテキストメニューを旧仕様に戻す方法 - Qiita
- Windows11 コンテキストメニューを Windows10 以前の仕様に戻す - Qiita
- Windows 11の設定に関するリファレンス - Windows apps
- Windowsスマートチューニング(369) Win 10編: タスクバーの検索ボックスをカスタマイズする - mynavi
- 懐古主義者のための Windows 11 セットアップマニュアル - retrotecture.jp
- コマンド プロンプトと Windows Powershell - Microsoft サポート
- Understanding Windows Console Host Settings - Microsoft Dev Blogs
- Win 10編: 検索ボックスから「ウェブ」を取り除く - mynavi
- ファイルエクスプローラーのスピードアップ ? - 内気なもんた君 - HatenaBlog
- 現在のユーザーが管理者か調べる - dobon.net
- レジストリからダークモードなどを設定 - guro_chanの手帳
- コメントベースのヘルプについて - PowerShell