Home > Windows にまつわる e.t.c.

右クリックメニューの「PowerShell で実行」を拡張する


Windows 10 の右クリックメニューには「PowerShell で実行」があります。(以前の Windows にもあります)

 

ところが、この右クリックメニューの「PowerShell で実行」は、実行後 PowerShell プロンプトを閉じてしまうので使い勝手が良いものではありません。そこで、スクリプト実行後にプロンプト閉じないようにする -NoExit オプションを以下レジストリに付加します。

キー HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\0\Command
名前 (既定)
種類 REG_SZ
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" "-NoExit" "-Command" "if((Get-ExecutionPolicy ) -ne 'AllSigned') { Set-ExecutionPolicy -Scope Process Bypass }; & '%1'"

こうすると、.ps1 実行後にプロンプトを閉じないので、結果を確認することができるようになります。

 

Shell\<キー> には以下の意味があります。

0 実行
Edit 編集
Open 開く
runas 管理者として実行

 

応用編で、管理者として実行する右クリックキーを追加するには、以下のレジストリ設定をします。
独自追加なので、右クリックで表示するメニューもセットします。

キー HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\runas
名前 (既定)
種類 REG_SZ
"Run with PowerShell as Administrator"

 

キー HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell\runas\Command
名前 (既定)
種類 REG_SZ
"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" "-NoExit" "-Command" "if((Get-ExecutionPolicy ) -ne 'AllSigned') { Set-ExecutionPolicy -Scope Process Bypass }; & '%1'"

 

PowerShell で設定するのなら、以下をコピペします。

New-PSDrive -Name HKCR -PSProvider Registry -Root HKEY_CLASSES_ROOT

# レジストリ更新
function SetReg( $RegPath, $RegKeyValue ){
    if( -not (Test-Path $RegPath) ){
        md $RegPath
    }
    Set-ItemProperty $RegPath -name "(default)" -Value $RegKeyValue
}

# 通常実行 command
$RegPath = "HKCR:\Microsoft.PowerShellScript.1\Shell\0\Command"
$RegKeyValue = "`"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe`" `"-NoExit`" `"-Command`" `"if((Get-ExecutionPolicy ) -ne 'AllSigned') { Set-ExecutionPolicy -Scope Process Bypass }; & '%1'`""
SetReg $RegPath $RegKeyValue

# 管理実行 menu
$RegPath = "HKCR:\Microsoft.PowerShellScript.1\Shell\runas"
$RegKeyValue = "Run with PowerShell as Administrator (&A)"
SetReg $RegPath $RegKeyValue

# 管理実行 command
$RegPath = "HKCR:\Microsoft.PowerShellScript.1\Shell\runas\Command"
$RegKeyValue = "`"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe`" `"-NoExit`" `"-Command`" `"if((Get-ExecutionPolicy ) -ne 'AllSigned') { Set-ExecutionPolicy -Scope Process Bypass }; & '%1'`""
SetReg $RegPath $RegKeyValue

 

サードパーティ製エディタの関連付け問題

Windows 10 デフォルト環境であればこの設定で良いのですが、秀丸エディタとかサクラエディターとかのサードパーティ製のエディタをインストールして、.ps1 に関連付けると、今まで表示できていた右クリックメニューが表示されなくなります。

関連付け変更

「PowerShell で実行」が消えた

 

右クリックメニューのふるまい整理

この問題解決をする前に、右クリックメニューがどのように動作するのかをまず整理します。

ファイルを右クリックすると、拡張子に対応する、以下のレジストリ値をとってきます。

キー HKEY_CLASSES_ROOT\.ps1
名前 (既定)
種類 REG_SZ

 

ここには、Microsoft.PowerShellScript.1 と書かれているので、以下レジストリが右クリックメニューになりります。

キー HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell

 

つまり、さっき設定したところですね。

 

拡張子をサードパーティプログラムに割り当てると、以下のキーが追加されます。

キー HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.ps1\UserChoice
名前 ProgId
種類 REG_SZ

 

この値が、デフォルト(HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell)設定より優先されるので、設定した右クリックメニューが表示されなくなるのです。

例えば、秀丸エディタを関連付けると、この値に「Applications\Hidemaru.exe」がセットされます。

すると、以下レジストリが右クリックメニューになります。

キー HKEY_CLASSES_ROOT\Applications\Hidemaru.exe\shell

 

このため、.ps1 デフォルトの右クリックメニューである HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell が参照されなくなるので右クリックメニューが表示されなくなるのです。

 

面白い事に、デフォルトの notepad.exe を関連付けると、HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.ps1\UserChoice には Microsoft.PowerShellScript.1 がセットされるので、結果的にデフォルトの右クリックメニューがまた表示されるようになります。

ざっとまとめると以下動作です。

Windows 10 Default

HKEY_CLASSES_ROOT\.ps1
→ Microsoft.PowerShellScript.1
→→ HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell

.ps1 に秀丸エディタを関連付け

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.ps1\UserChoice
→ Applications\Hidemaru.exe
→→ HKEY_CLASSES_ROOT\Applications\Hidemaru.exe\shell

.ps1 に notepad.exe を関連付け

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.ps1\UserChoice
→ Microsoft.PowerShellScript.1
→→ HKEY_CLASSES_ROOT\Microsoft.PowerShellScript.1\Shell

 

仕組みがわかれば、どこに右クリックメニューを追加すれば良いのか判断できるので、以下の PowerShell スクリプトで右クリックメニューを追加できます。

 

New-PSDrive -Name HKCR -PSProvider Registry -Root HKEY_CLASSES_ROOT

# 関連付けられている .exe
$AppModuleName = "Hidemaru.exe"

# レジストリ更新
function SetReg( $RegPath, $RegKeyValue ){
    if( -not (Test-Path $RegPath) ){
        md $RegPath
    }
    Set-ItemProperty $RegPath -name "(default)" -Value $RegKeyValue
}

# 通常実行 menu
$RegPath = "HKCR:\Applications\" + $AppModuleName + "\shell\0"
$RegKeyValue = "Run with PowerShell (&P)"
SetReg $RegPath $RegKeyValue

# 通常実行 command
$RegPath = "HKCR:\Applications\" + $AppModuleName + "\shell\0\Command"
$RegKeyValue = "`"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe`" `"-NoExit`" `"-Command`" `"if((Get-ExecutionPolicy ) -ne 'AllSigned') { Set-ExecutionPolicy -Scope Process Bypass }; & '%1'`""
SetReg $RegPath $RegKeyValue

# 管理実行 menu
$RegPath = "HKCR:\Applications\" + $AppModuleName + "\shell\runas"
$RegKeyValue = "Run with PowerShell as Administrator (&A)"
SetReg $RegPath $RegKeyValue

# 管理実行 command
$RegPath = "HKCR:\Applications\" + $AppModuleName + "\shell\runas\Command"
$RegKeyValue = "`"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe`" `"-NoExit`" `"-Command`" `"if((Get-ExecutionPolicy ) -ne 'AllSigned') { Set-ExecutionPolicy -Scope Process Bypass }; & '%1'`""
SetReg $RegPath $RegKeyValue

 

関連情報

エクスプローラーの右クリックで PowerShell プロンプトを開く
http://www.vwnet.jp/Windows/PowerShell/OpenPowerShellPrompt.htm

 

 

back.gif (1980 バイト)

home.gif (1907 バイト)

Copyright © MURA All rights reserved.