どうもミツシマです。
今回は仮想メモリの設定をPowershellコマンドにて設定する方法を検証してみた。
検証環境は以下の通り
PC:Windows10 Pro 1809
~検証~
WMI(Win32_PageFileSettingクラス)を使用して設定出来そうなのでチャレンジ。
が、コマンドは合っていそうなのに設定出来ない。。なぜ!!
コマンドプロンプトにて「wmic pagefileset」と入力すると
「利用できるインスタンスがありません。」と出る。
え、、何それ、、、汗
色々と検証した結果、仮想メモリの初期設定である「すべてのドライブのページングファイルのサイズを自動的に管理する」だとどうやらWMIインスタンスが動作していない?ような感じである。
なので、一旦これを解除した上で仮想メモリを設定するという流れでスクリプトを組んでみることに
<参考画面>
上が「すべてのドライブのページングファイルのサイズを自動的に管理する」がオンの時のコマンド結果
上が「すべてのドライブのページングファイルのサイズを自動的に管理する」がオフの時のコマンド結果

で、完成したスクリプトがこちら↓↓↓
~SettingPageFile.ps1~
#環境変数
$InitialSize = 2048
$MaximumSize = 2048
$InitialSize = 2048
$MaximumSize = 2048
#スクリプトのパス取得
$ScriptFullPath = $MyInvocation.MyCommand.Path
$ScriptFullPath = $MyInvocation.MyCommand.Path
#管理者として実行しているかを確認し、管理者で実行されていなければ、管理者として再実行する
$WindowsPrincipal = [Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()
if (-Not($WindowsPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))){
Write-Output "管理者として実行されていません。再度管理者で実行します。"
Start-Process powershell.exe -ArgumentList "-ExecutionPolicy RemoteSigned -command $ScriptFullPath" -Verb runas
Exit
}
$WindowsPrincipal = [Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()
if (-Not($WindowsPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))){
Write-Output "管理者として実行されていません。再度管理者で実行します。"
Start-Process powershell.exe -ArgumentList "-ExecutionPolicy RemoteSigned -command $ScriptFullPath" -Verb runas
Exit
}
#「すべてのドライブのページングファイルのサイズを自動的に管理する」の設定の場合
#WMIインスタンスを取得出来ない為、一旦「システム管理サイズ」へ変更するレジストリ追加
cmd /c "reg add ""HKLM\SYSTEM\ControlSet001\Control\Session Manager\Memory Management"" /v ""PagingFiles"" /t REG_MULTI_SZ /d ""c:\pagefile.sys 0 0"" /f"
#WMIオブジェクト取得
$Wmiobj = Get-WmiObject Win32_PageFileSetting
$Wmiobj = Get-WmiObject Win32_PageFileSetting
#仮想メモリを変更
$Wmiobj.InitialSize = $InitialSize
$Wmiobj.MaximumSize = $MaximumSize
$Wmiobj.put()
$Wmiobj.MaximumSize = $MaximumSize
$Wmiobj.put()
~解説~
まず環境変数にて仮想メモリの「初期サイズ」と「最大サイズ」を指定している。
※ここでは「2048MB(2GB)」で設定している例になる。
※ここでは「2048MB(2GB)」で設定している例になる。
その後、いつも通り管理者として実行しているかをチェックした後、レジストリを変更している。
これは「すべてのドライブのページングファイルのサイズを自動的に管理する」のチェックを外し、一旦「システム管理サイズ」に設定変更する為のレジストリ値である。
レジストリで設定出来るなら、そのままレジストリで設定すればいいじゃん、という感じだが、レジストリで設定したものが正常に反映されるか怖かったので、あくまで最終的にはWMI経由で設定をしている。
(最終的には正規?の手段での変更なのでシステム上も上手く変更・反映されていいかな~という個人的な思いからである。)
これは「すべてのドライブのページングファイルのサイズを自動的に管理する」のチェックを外し、一旦「システム管理サイズ」に設定変更する為のレジストリ値である。
レジストリで設定出来るなら、そのままレジストリで設定すればいいじゃん、という感じだが、レジストリで設定したものが正常に反映されるか怖かったので、あくまで最終的にはWMI経由で設定をしている。
(最終的には正規?の手段での変更なのでシステム上も上手く変更・反映されていいかな~という個人的な思いからである。)
後はWMIで設定変更して完了!!
スクリプト実行前

スクリプト実行後

また、わざわざ仮想メモリの設定を指定するのではなく、「搭載している物理メモリの容量の2倍を設定する」みたいなことも出来たら便利かと思って作成したスクリプトがこちら↓↓↓
#管理者として実行しているかを確認し、管理者で実行されていなければ、管理者として再実行する
$WindowsPrincipal = [Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()
if (-Not($WindowsPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))){
Write-Output "管理者として実行されていません。再度管理者で実行します。"
Start-Process powershell.exe -ArgumentList "-ExecutionPolicy RemoteSigned -command $ScriptFullPath" -Verb runas
Exit
}
#「すべてのドライブのページングファイルのサイズを自動的に管理する」の設定の場合
#WMIインスタンスを取得出来ない為、一旦「システム管理サイズ」へ変更するレジストリ追加
cmd /c "reg add ""HKLM\SYSTEM\ControlSet001\Control\Session Manager\Memory Management"" /v ""PagingFiles"" /t REG_MULTI_SZ /d ""c:\pagefile.sys 0 0"" /f"
#WMIオブジェクト取得
$WmiObjPageFileSetting = Get-WmiObject Win32_PageFileSetting
$WmiObjComputerSystem = Get-WmiObject Win32_ComputerSystem
#搭載メモリを取得
$MainMemory = [System.Convert]::ToInt32($WmiObjComputerSystem.TotalPhysicalMemory / (1024 * 1024 * 1024))
#Write-Host "メインメモリ:" $MainMemory "GB"
#設定する仮想メモリの値を設定
$MainMemory = $MainMemory * 1024
[int32]$PageFileSet = $MainMemory * $IntSet
#Write-Host "セットする仮想メモリ値:" $PageFileSet "MB"
#仮想メモリを変更
$WmiObjPageFileSetting.InitialSize = $PageFileSet
$WmiObjPageFileSetting.MaximumSize = $PageFileSet
$WmiObjPageFileSetting.put()
スクリプト実行前

スクリプト実行後

また、わざわざ仮想メモリの設定を指定するのではなく、「搭載している物理メモリの容量の2倍を設定する」みたいなことも出来たら便利かと思って作成したスクリプトがこちら↓↓↓
~SettingPageFile2.ps1~
#環境変数(仮想メモリを実メモリに対して何倍に設定するか?) ※ここでは2倍にしている
[int32]$IntSet = 2
[int32]$IntSet = 2
#スクリプトのパス取得
$ScriptFullPath = $MyInvocation.MyCommand.Path
$ScriptFullPath = $MyInvocation.MyCommand.Path
#管理者として実行しているかを確認し、管理者で実行されていなければ、管理者として再実行する
$WindowsPrincipal = [Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()
if (-Not($WindowsPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator"))){
Write-Output "管理者として実行されていません。再度管理者で実行します。"
Start-Process powershell.exe -ArgumentList "-ExecutionPolicy RemoteSigned -command $ScriptFullPath" -Verb runas
Exit
}
#「すべてのドライブのページングファイルのサイズを自動的に管理する」の設定の場合
#WMIインスタンスを取得出来ない為、一旦「システム管理サイズ」へ変更するレジストリ追加
cmd /c "reg add ""HKLM\SYSTEM\ControlSet001\Control\Session Manager\Memory Management"" /v ""PagingFiles"" /t REG_MULTI_SZ /d ""c:\pagefile.sys 0 0"" /f"
#WMIオブジェクト取得
$WmiObjPageFileSetting = Get-WmiObject Win32_PageFileSetting
$WmiObjComputerSystem = Get-WmiObject Win32_ComputerSystem
#搭載メモリを取得
$MainMemory = [System.Convert]::ToInt32($WmiObjComputerSystem.TotalPhysicalMemory / (1024 * 1024 * 1024))
#Write-Host "メインメモリ:" $MainMemory "GB"
#設定する仮想メモリの値を設定
$MainMemory = $MainMemory * 1024
[int32]$PageFileSet = $MainMemory * $IntSet
#Write-Host "セットする仮想メモリ値:" $PageFileSet "MB"
#仮想メモリを変更
$WmiObjPageFileSetting.InitialSize = $PageFileSet
$WmiObjPageFileSetting.MaximumSize = $PageFileSet
$WmiObjPageFileSetting.put()
搭載されているメモリを取得するためにWMI(Win32_ComputerSystemクラス)を使用している。
今回はこんな所で検証終了!!
P.S.ソードアートオンライン アリシゼーション2期スタート超うれしい(^^)
スポンサードリンク
コメント