パソコン上で雑多なメモを取る場合、内容が不定の場合が多く、あらかじめ保存するファイル名を決めることが出来ません。もっぱら日時のファイル名(yyyyMMdd-HHmmss.txt)としてメモを取るのですが、最近は日時の入力が面倒になってきました。さらにこの方法は検索性があまりよくないです。このような問題を解決するため、日時形式のファイル名を自動生成し、カレントフォルダ内のテキストファイルを文字検索機能を付けたメモの管理スクリプトをPowerShellで作成しました。
ファイル名:DailyMemo.psm1
保存場所:%Userprofile%\Documents\WindowsPowerShell\Modules\DailyMemo
(※フォルダが無い場合作成のこと)
保存場所:%Userprofile%\Documents\WindowsPowerShell\Modules\DailyMemo
(※フォルダが無い場合作成のこと)
<#
.SYNOPSIS
メモを取ったテキストファイルを管理します。
.DESCRIPTION
・新規作成(-Mode New)
カレントディレクトリに「yyyyMMdd-HHmmss.txt」形式でファイルを作成し任意のテキストエディターで開きます。
・一覧(-Mode List)
FileNo:ファイル番号
Name:ファイル名
Title:テキストファイルの一行目
・更新(-Mode Update)
直近作成したファイル(ファイル番号0)をテキストエディターで開きます。
・検索(-Mode Search)
-Patternで指定した検索文字をテキストファイルから検索
・削除(-Mode Delete)
直近作成したファイル(ファイル番号0)を削除
.PARAMETER Mode
・操作モード
New:新規作成
List:一覧
Update:更新
Serach:検索
Delete:削除
.PARAMETER Pattern
・検索時の検索文字列
.PARAMETER FileNo
・更新・削除の対象ファイル番号。デフォルト0(直近作成のファイル)
.PARAMETER When
・日付による絞り込み
Today:本日
Yesterday:昨日
Lasted:直近10件(デフォルト)
yyyyMMddHHmmss:日付(西暦形式)
All:全て
#>
# 新規作成
function New-Memo {
# 一時ファイルの作成
$tempFile = New-TemporaryFile
$fileName = ("{0}.txt" -f $tempFile.CreationTime.ToString("yyyyMMdd-HHmmss"))
$outPath = (Join-Path (pwd) $fileName)
mv $tempFile $outPath
Start-Process -FilePath $EditorPath -ArgumentList $outPath -Wait
}
# 一覧
function List-Memo {
$WhenParam = $When
# 取得件数
$CountLimit = -1
if ($When -match "Today") {
$WhenParam = [DateTime]::Today.ToString('yyyyMMdd')
} elseif ($When -match "Yesterday") {
$WhenParam = [DateTime]::Today.AddDays(-1).ToString('yyyyMMdd')
} elseif ($When -Match "Lasted") {
$CountLimit = 10
$WhenParam = "."
} elseif ($When -Match "All") {
$WhenParam = "."
}
$lm = ls *.txt | ? {$_.CreationTime.ToString('yyyyMMdd') -match $WhenParam } | sort -Descending -Property CreationTime | % -Begin {
$i = 0
} -Process {
[PSCustomObject]@{"FileNo"=$i; "Name"=$_.Name; "Title"=(cat $_.FullName -TotalCount 1 -Encoding UTF8)}
$i++
}
if ($CountLimit -eq -1) {
$lm
} else {
$lm | select -First $CountLimit
}
}
# 更新
function Update-Memo {
$lm = List-Memo
if ($lm -eq $null) {
# 新規作成
New-Memo
return
}
$outPath = Join-Path (pwd) $lm[$FileNo].Name
Start-Process -FilePath $EditorPath -ArgumentList $outPath -Wait
}
# 検索
function Search-Memo {
List-Memo | % {
$v = (sls -LiteralPath $_.FullName -Pattern $Pattern)
if ($v) {
[PsCustomObject]@{
"FileNo" = $_.FileNo;
"Value" = $v
}
}
}
}
# 削除
function Delete-Memo {
$lm = List-Memo
if ($lm -eq $null) {
return
}
$outPath = Join-Path (pwd) $lm[$FileNo].Name
# 問い合わせをするコードを書くと良い
rm $outPath
}
###############################################################################
# Main
###############################################################################
function DailyMemo {
param(
[ValidateSet("New", "List", "Update", "Search", "Delete")]
[string]$Mode, # 操作モード
[string]$FileNo = "0", # ファイル番号
[string]$Pattern, # 検索文字列
[string]$When = "Lasted" # 日付条件
)
# テキストエディターのパス
$EditorPath = "NOTEPAD.EXE"
# PSバージョンチェック
$PsVer = $PSVersionTable.PSVersion.Major
if ($PsVer -lt 5) {
Write-Host "Version 4未満は未対応"
exit
} elseif ($PsVer -gt 5) {
Write-Host "Version 6以上は未確認"
exit
}
# コマンドライン引数がない場合補う
if ($Mode -eq "") {
$Mode = "New"
}
# 各モードの選択
Switch ($Mode) {
# 新規作成
"New" {
New-Memo
}
# 一覧
"List" {
List-Memo
}
# 更新
"Update" {
Update-Memo
}
# 検索
"Search" {
Search-Memo
}
# 削除
"Delete" {
Delete-Memo
}
# その他はヘルプを表示
Default {
Get-Help "DailyMemo"
}
}
}
Export-ModuleMember -Function DailyMemo
コメント