Windows10シャットダウンショートカット3連発+1

コンピュータ

スクリプトを実行すると「シャットダウン」「再起動」「ログオフ」のショートカットがデスクトップに作成されます。shutdown.exeへのショートカットでオプションが違うだけです。わざわざショートカットを作る必要があるかは人それぞれだとは思いますが、デスクトップにあると便利かと思います。

Windows10になってシャットダウンや再起動をしてもアプリケーションが終了してくれない(アプリも再起動している?)ので、ちょっと困っていました。高速スタートアップの機能であることは後で知ったのですが、シャットダウンするたびにアプリケーションを手動で閉じるなくてはならず、何と面倒な振る舞いになったものだと思っていました。

そも自分のパソコンの使い方は、基本電源を落とさず、使わないときはスリープにしていまして、シャットダウンや再起動は、パソコンの動きが悪くなってきた時やシステムメンテナンスをする時など、クリーンブートをしたいケースがほとんどです。

そんな人間用に今回のショートカットは全てのアプリケーションが終了するオプションが設定してあります。通常のシャットダウン(高速スタートアップ)を望む場合は/fのオプションを外してください。スクリプトを修正しても良いですし、出来上がったショートカットのプロパティで変更しても良いです。

あと、Windows10でUEFIで起動している環境限定ですが再起動後UEFIの画面が立ち上がるショートカットも作成されます。該当環境にない場合はUEFIのショートカットは作成されませんのでご了承ください。

まだ自分は実施していませんが最近のマザーボードの機能でUEFIのFastBootを有効にするとUEFIからの起動が速くなってUEFIの設定画面に入るキーが受け付けられない為このような機能が必要となったようです。マザーボードの付属アプリとかにも同様な代物がありますが、このショートカットの実態もshutdown.exeです。

Windows10の高速スタートアップにしてもUEFIのFastBootにしても、起動が高速化するのは良いですが、パソコンが安定動作していることが前提となります。Windows10の高速スタートアップはデフォルトで有効になっており、それだけ今時のパソコンは安定しているのだと思いますが、昔からある「パソコンの調子が悪くなったらとりあえず再起動してみる」という民間療法が使えないのはちょっと不安を感じます。再起動は完全シャットダウンされるので高速スタートアップは実行されないのでWindows10でも「とりあえず再起動」は健在のようです。

 

スクリプトの動作確認はWindows7とWindow10のみ実施しています。Windows8などでも動くかもしれませんが動作確認環境がないです。

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

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

スクリプト

#
# シャットダウンショートカット3連発+1
#

$ErrorActionPreference = "Stop"


$sShutdownExe = Join-Path (Get-Item $env:ComSpec).DirectoryName "shutdown.exe"

# シャットダウン

$sTargetPath = Join-Path ([Environment]::GetFolderPath('desktop')) "\シャットダウン.lnk"

$oWSH = New-Object -ComObject WScript.Shell
$oShortcut = $oWSH.CreateShortcut($sTargetPath)
$oShortcut.TargetPath = $sShutdownExe
$oShortcut.Arguments = "/s /f /t 0"
$oShortcut.IconLocation = Join-Path (Get-Item $env:ComSpec).DirectoryName "SHELL32.dll,27"
$oShortcut.Description = "ユーザーに警告せず即時にシャットダウン"
$oShortcut.WorkingDirectory = "%HOMEPATH%"
$oShortcut.Save()

# 再起動

$sTargetPath = Join-Path ([Environment]::GetFolderPath('desktop')) "\再起動.lnk"

$oWSH = New-Object -ComObject WScript.Shell
$oShortcut = $oWSH.CreateShortcut($sTargetPath)
$oShortcut.TargetPath = $sShutdownExe
$oShortcut.Arguments = "/r /f /t 0"
$oShortcut.IconLocation = Join-Path (Get-Item $env:ComSpec).DirectoryName "SHELL32.dll,238"
$oShortcut.Description = "即時再起動"
$oShortcut.WorkingDirectory = "%HOMEPATH%"
$oShortcut.Save()


# ログオフ

$sTargetPath = Join-Path ([Environment]::GetFolderPath('desktop')) "\ログオフ.lnk"

$oWSH = New-Object -ComObject WScript.Shell
$oShortcut = $oWSH.CreateShortcut($sTargetPath)
$oShortcut.TargetPath = $sShutdownExe
$oShortcut.Arguments = "/l /f"
$oShortcut.IconLocation = Join-Path (Get-Item $env:ComSpec).DirectoryName "SHELL32.dll,44"
$oShortcut.Description = "ログオフ"
$oShortcut.WorkingDirectory = "%HOMEPATH%"
$oShortcut.Save()



# Windowsのバージョン確認
$ver = [decimal]0.0
if ((Get-WmiObject Win32_OperatingSystem).Version -match "(\d+\.\d+)") {
    $ver = [decimal]$Matches[0]
}
if ($ver -le 6.4) {
    exit
}


# 再起動・UEFI設定

try {
    Confirm-SecureBootUEFI | Out-Null

    $sTargetPath = Join-Path ([Environment]::GetFolderPath('desktop')) "\UEFI設定.lnk"

    $oWSH = New-Object -ComObject WScript.Shell
    $oShortcut = $oWSH.CreateShortcut($sTargetPath)
    $oShortcut.TargetPath = $sShutdownExe
    $oShortcut.Arguments = "/r /fw /f /t 0"
    $oShortcut.IconLocation = Join-Path (Get-Item $env:ComSpec).DirectoryName "SHELL32.dll,174"
    $oShortcut.Description = "再起動後UEFI設定"
    $oShortcut.WorkingDirectory = "%HOMEPATH%"
    $oShortcut.Save()

    $byArray = [System.IO.File]::ReadAllBytes($sTargetPath)
    $byArray[0x15] = $byArray[0x15] -bor 0x20
    [System.IO.File]::WriteAllBytes($sTargetPath, $byArray)

} catch [UnauthorizedAccessException]{
    # 多分BIOS
    #echo $_.Exception
}
exit

コメント