Windows10をスリープ(サスペンド)するスクリプト

コンピュータ

シャットダウンのショートカットを作ってスリープ(サスペンド)が無いのは片手落ちかなと思い作成してみました。

シャットダウンはshutdown.exeへのショートカットで済みましたが、スリープの場合そういったコマンドが無くwin32apiを実行するしかなさそうです。COM(コンポーネント オブジェクト モデル)ではないDLL(ダイナミックライブラリ)の関数を呼び出す必要があります。

スクリプト言語から呼び出す代物ではないような気もしますがpowersehllで出来るか調べてみました。powersehllから呼び出すにはスクリプト内でC#を記述しC#内でwin32apiを呼び出すことで実行出来るようです。

スクリプトでやる仕事かどうかは別としてC#を記述することができwin32apiまで呼び出せるとするとpowersehllは大概のことが出来ることになります。これをきにC#を学んでみるのもよいかなと思いました。

勉強が足りていなくC#への変数引渡や戻り値など(特に型)大分あやしい部分が多いですが、とりあえず動いたので良しとします。

スクリプトを引数なしで実行するとデスクトップに「スリープ」のショートカットが出来上がります。インストール作業だと思ってください。

スリープを実行する場合はデスクトップのショートカットを実行するか、powersehllから実行する場合は、-Suspendのオプションをつけてください。ちなみにオプションに-Hibernationを付けると休止状態になると思います。

 

PowerShellスクリプトを初めて実行する場合

PowerShellスクリプトの実行を許可してください。
Powershellのps1ファイルを実行する方法
PowersehllをはじめるにあたりWindowsのコマンドラインインターフェースであるPowershellはコマンドレットと言われる命令をテキストファイルに記述したスクリプトファイルを実行することが出来ます。Powershellはその名...

 

スクリプト

# 
# Windowsをスリープするスクリプト
# 

Param (
    [switch]$Suspend,
    [switch]$Hibernation
)

$ErrorActionPreference = "Stop"

$sSelfScriptPath = $MyInvocation.MyCommand.Path

if (($Suspend -eq $false) -and ($Hibernation -eq $false)) {
    echo "ショートカット作成"

    $sTargetPath = Join-Path ([Environment]::GetFolderPath('desktop')) "\スリープ.lnk"

    $oWSH = New-Object -ComObject WScript.Shell
    $oShortcut = $oWSH.CreateShortcut($sTargetPath)
    $oShortcut.TargetPath = Join-Path $PSHOME "powershell.exe"
    $oShortcut.Arguments = ($sSelfScriptPath + " -Suspend ")
    $oShortcut.IconLocation = Join-Path (Get-Item $env:ComSpec).DirectoryName "SHELL32.dll,265"
    $oShortcut.Description = "スリープします。"
    $oShortcut.WorkingDirectory = "%HOMEPATH%"
    $oShortcut.Save()

    exit
}

$bHibernate = $false
if ($Suspend -eq $true) {
    $bHibernate = $false
}
if ($Hibernation -eq $true) {
    $bHibernate = $true
}

$methods = @'
[return: MarshalAs(UnmanagedType.Bool)]
[DllImport("powrprof.dll", SetLastError = true, CharSet = CharSet.Auto)]
public static extern bool SetSuspendState(bool bHibernate, bool bForce, bool bWakeupEventsDisabled);
'@

$Powerprof = Add-Type -MemberDefinition $methods -Name "PowerProf" -PassThru -Language CSharp

$Powerprof::SetSuspendState($bHibernate,$false,$false) | Out-Null

コメント