エクスプローラのフォルダで「右クリック」→「新規作成(X)」を選ぶと色々なアプリケーション名が出てきますが、残念ながら「Windows Powersehll スクリプト」の名前が見当たりません。今回はこちらに「Windows Powersehll スクリプト」を追加するスクリプトを作りました。
エクスプローラでファイルを新規作成する
ファイルを新規作成する方法はアプリケーションから新規作成するのがスタンダードなやり方ですが、その場合ファイル名とそのファイルを保存する場所はファイルの内容を作成後保存時に決定する手順になります。もちろんそのやり方が悪いわけではありませんが、私の場合まずエクスプローラでファイルを保存する場所とファイル名を先に決めて空ファイルを作成しそちらをアプリケーションで編集するやり方が好みです。
メリットとしては、先に場所と名前を決めておくとファイルが行方不明になりにくいという点です。
アプリケーションから新規作成すると途中で中断する場合、とりあえずファイルを一時保存することになりますが、私の場合その一時保存したファイルがよく行方不明になります。
作業を中断するということは、より優先順位の高い作業が発生していますので、即その作業に取り掛かりたいのに、ファイルを何処にどんな名前で保存しますか?とアプリケーションが聞いてきます。急いでいる私は良く吟味することなくファイル名をつけ保存してしまいます。再開時に「あれ何て名前で保存したっけ?」となりがちです。
システムかユーザーに致命的な欠陥があるのでは?と疑いたくなるほど高確率で行方不明にまります。それに対し事前にファイルを新規作成しておくと中断したい場合はファイルを上書き保存することが出来ます。多くのアプリケーションで[Ctrl]+[S]を押せば上書き保存することができ、すぐに別な作業に入ることができます。
注意点
このスクリプトはレジストリを操作しております。レジストリを誤って操作した場合システムに致命的な障害を発生させる場合がございます。実施は自己責任でお願い致します。
管理者として実行してください。
PowerShellスクリプトを初めて実行する場合
スクリプト
<#
.SYNOPSIS
ps1ファイルをエクスプローラの新規作成に追加する。
.DESCRIPTION
PowerShellスクリプトをエクスプローラから新規作成することが出来るようにするスクリプトです。
$code変数のヒアドキュメントがテンプレートファイルの内容となりますので、お好みの内容に書き換えると良いです。
スクリプト内でレジストリを書き変えています。
レジストリは操作を誤るとシステムに致命的な損害を与える場合がありますので実施は自己責任でお願い足します。
アンインストールしたい場合はレジストリエディタで"HKEY_CLASSES_ROOT\.ps1\ShellNew"を削除してください。
<CommonParameters>はサポートしません。
.EXAMPLE
ps>.\AddnewPs1.ps1
.PARAMETER 無し
.LINK
#>
$ErrorActionPreference = "STOP"
$code = @'
<#
.SYNOPSIS
概要
<CommonParameters> はサポートしていません
.DESCRIPTION
説明
.EXAMPLE
使い方
.PARAMETER Exc
引数にういて
.LINK
#>
param(
[switch]$Exec
)
$ErrorActionPreference = "STOP"
function Template
{
param(
[Parameter(ValueFromPipeline=$true,Mandatory=$true)]
[string[]]
$Text
)
begin {}
process {
foreach ($s in $Text) {
$Text
}
}
end {}
}
if ($Exec) { @(1,2,3) | Template }
'@
$psd = "HKCR"
New-PSDrive -name $psd -PSProvider "Registry" -root "HKEY_CLASSES_ROOT"
$ps1_reg_path = $psd + ":\.ps1"
if (-not(Test-Path $ps1_reg_path)) { exit }
$ps1_shellnew_path = $ps1_reg_path + "\ShellNew"
if (-not(Test-Path $ps1_shellnew_path)) { New-Item $ps1_shellnew_path | Out-Null}
$TemplateFile = "template.ps1"
$TemplatePath = Join-Path $env:USERPROFILE ("Templates\" + $TemplateFile)
Set-Content -Value $code -LiteralPath $TemplatePath -Encoding UTF8
if (-not ((Get-ItemProperty $ps1_shellnew_path).FileName)) {
New-ItemProperty $ps1_shellnew_path -Name "FileName" -Value $TemplateFile | Out-Null
}
あとがき
今回はPowershellスクリプトを新規作成するようにしましたが、スクリプト内の拡張子とテンプレートファイルの中身を書きかえれば別のアプリケーションにも対応することが出来ます。
追記20220429
Windows11では動きません
追記20240505
Window11では$env:USERPROFILEのTemplatesフォルダにアクセスが出来ませんでした。
アクセス可能な適当なフォルダにテンプレートファイルを用意したところ動作しました。(上記スクリプトは未確認)
コメント