PowerShellでToDoリストを改善する – Part 1: データ永続性とファイル操作

※本サイトはプロモーションが含まれています。

この記事ではPowerShellを使用してToDoリストのデータ永続性を実現する方法に焦点を当てて解説していきます。データを一時的に保持するだけでなく、永続的に保存し、再度アクセスすることで、より実用的なToDoリストを作成する方法を学びます。

データ永続性とは

データ永続性とは、データを一時的なメモリ上ではなく、永続的に保存することを指します。例えば、アプリケーションやウェブサイトで入力した情報を、再起動やブラウザの再読み込み後も保持し続けることができるようにするための仕組みです。このデータ永続性は、ユーザーが安心してアプリケーションやサービスを利用するための基本的な要件となっています。

データの永続性がないと、ユーザーが入力した情報や設定が失われてしまい、その都度再入力が必要となります。これは非常に手間がかかり、ユーザーの利便性を損なう要因となります。特に、ToDoリストのような情報を頻繁に更新するアプリケーションでは、データの永続性は必須となります。

上司
上司

コンソール閉じたらデータが全部消えてしまいそうだね。

データが保管されないのは困るな…。

猫道
猫道

保管したいなんて言ってなかったじゃないか

このような要望を受けて、データ永続性を持ったToDoリストの作成が求められています。次のセクションでは、PowerShellを使用して、このデータ永続性を実現する方法を詳しく解説していきます。

PowerShellでのファイル操作の基本

PowerShellは、Windowsの標準シェルとして提供されている強力なスクリプト言語です。そのため、ファイルの操作も非常に簡単に行うことができます。ここでは、ファイルの基本的な読み込みと書き込みの方法を紹介します。

ファイルの読み込み

PowerShellでファイルを読み込むには、Get-Content コマンドを使用します。

$content = Get-Content -Path "C:\path\to\your\file.txt"
Write-Output $content

上記のコードは、指定したパスのファイルの内容を読み込み、それを $content という変数に格納しています。その後、Write-Output コマンドで内容を表示しています。

ファイルの書き込み

ファイルへの書き込みは、Set-Content コマンドを使用します。

$text = "これはテストのテキストです。"
Set-Content -Path "C:\path\to\your\file.txt" -Value $text

このコードは、$text という変数に格納されたテキストを指定したパスのファイルに書き込んでいます。

猫道
猫道

これらのコマンドを覚えることで、色々なことができるようになります。

ToDoリストでファイルの保存/読み込みをする方法

これまでに作成したToDoリストのプログラムでは、タスクの追加、表示、削除の基本的な機能を実装してきました。しかし、プログラムを終了するとタスクのデータは失われてしまいます。このセクションでは、タスクのデータをファイルに保存し、再度プログラムを起動した際にそのデータを読み込む方法を学びます。

「work」フォルダ内に「data」フォルダを作成し、「tasks.txt」を配置することにします。

ファイルへの保存

以下の関数を追加して、タスクのデータをファイルに保存します。

# タスクの保存機能
function SaveTasks {
    $script:tasks | Out-File "C:\Users\Owner\Desktop\work\data\tasks.txt"
    Write-Host "タスクがファイルに保存されました。"
}

この関数は、$tasks 配列の内容を Out-File コマンドを使用してファイルに書き込んでいます。

「|」について

「|」はパイプと呼ばれる記号で、Unix系OSやPowerShellなどのシェル環境で使用されます。一つのコマンドの出力を、次のコマンドの入力として渡す役割を持ちます。これにより、複数のコマンドを連鎖的に実行することができます。「Shift」+「\」キーで入力できます。

ファイルからの読み込み

次に、プログラムの開始時にファイルからタスクのデータを読み込む機能を追加します。

# タスクの配列を宣言
$tasks = @()

# ファイル読み込み
$tasks += Get-Content "C:\Users\Owner\Desktop\work\data\tasks.txt"
Write-Host "タスクがファイルから読み込まれました。"

このコードは、指定したパスのファイルが存在する場合、そのファイルの内容を $tasks 配列に読み込んでいます。

猫道
猫道

ファイルパスは自分の配置した場所にしてね。

メニューに保存機能の呼び出しを追加

# メニュー表示
do {
    $choice = Read-Host "操作を選択してください (1: タスク追加, 2: タスク表示, 3: タスク削除, 4: タスク保存, 5: 終了)"
    switch ($choice) {
        '1' { AddTask }
        '2' { ShowTasks }
        '3' { RemoveTask }
        '4' { SaveTasks }
        '5' { Write-Host "プログラムを終了します。"; break }
        default { Write-Host "無効な選択です。再度選択してください。" }
    }
} while ($choice -ne '5')

上記の修正により、メニューから「4: タスク保存」という選択肢を選ぶことで、SaveTasks 関数が呼び出され、タスクのデータがファイルに保存されるようになります。

動作確認

ソースコード

以下が取込版のソースコードになります。

# タスクの配列を宣言
$tasks = @()

# ファイル読み込み
$tasks += Get-Content "C:\Users\Owner\Desktop\work\data\tasks.txt"
Write-Host "タスクがファイルから読み込まれました。"

# タスクの追加機能
function AddTask {
    $task = Read-Host "追加したいタスクを入力してください"
    $script:tasks += $task
    Write-Host "$task がToDoリストに追加されました。"
}

# タスクの表示機能
function ShowTasks {
    Write-Host "現在のタスク一覧:"
    for ($i=0; $i -lt $script:tasks.Length; $i++) {
        Write-Host ("[" + ($i + 1) + "] " + $script:tasks[$i])
    }
}

# タスクの削除機能
function RemoveTask {
    # 現在のタスク一覧を表示
    ShowTasks

    # ユーザーに削除したいタスクの番号を入力させる
    $index = Read-Host "削除したいタスクの番号を入力してください"

    # 入力された番号が有効な範囲内にあるかを確認
    if ($index -ge 1 -and $index -le $script:tasks.Length) {
        # 選択された番号のタスクを取得
        $removedTask = $script:tasks[$index-1]

        # タスクが1つだけの場合、タスクの配列を空にする
        if ($script:tasks.Length -eq 1) {
            $script:tasks = @()
        } 
        # 最初のタスクを削除する場合
        elseif ($index -eq 1) {
            $script:tasks = $script:tasks[1..($script:tasks.Length-1)]
        } 
        # 最後のタスクを削除する場合
        elseif ($index -eq $script:tasks.Length) {
            $script:tasks = $script:tasks[0..($index-2)]
        } 
        # 最初や最後以外のタスクを削除する場合
        else {
            $script:tasks = $script:tasks[0..($index-2)] + $script:tasks[$index..($script:tasks.Length-1)]
        }

        # 削除されたタスクの情報を表示
        Write-Host "$removedTask がToDoリストから削除されました。"
    } else {
        # 無効な番号が入力された場合のメッセージを表示
        Write-Host "無効な番号です。再度選択してください。"
    }
}

#タスクの保存機能
function SaveTasks {
    $script:tasks | Out-File "C:\Users\Owner\Desktop\work\data\tasks.txt"
    Write-Host "タスクがファイルに保存されました。"
}


# メニュー表示
do {
    $choice = Read-Host "操作を選択してください (1: タスク追加, 2: タスク表示, 3: タスク削除, 4: タスク保存, 5: 終了)"
    switch ($choice) {
        '1' { AddTask }
        '2' { ShowTasks }
        '3' { RemoveTask }
        '4' { SaveTasks }
        '5' { Write-Host "プログラムを終了します。"; break }
        default { Write-Host "無効な選択です。再度選択してください。" }
    }
} while ($choice -ne '5')

実機の動作

1.朝ごはんタスクを追加、保存し、プログラムを終了します。

2.「tasks.txt」を開くと、タスクが保存されています。

3.再度プログラムを起動すると、保存したタスクが読み込まれました。

猫道
猫道

できたー

実行ポリシーの考慮

PowerShellのスクリプト(.ps1ファイル)を直接実行する場合、実行ポリシーの制限により、スクリプトが実行されないことがあります。特に、初めてPowerShellスクリプトを実行する場合や、セキュリティ設定が厳格な環境では、この問題に直面することが多いです。

猫道
猫道

上司のPC環境では動かないかもしれない…

この問題を回避するための一つの方法として、batファイルからPowerShellスクリプトを呼び出す方法があります。

batファイルについて

batファイルは、Windowsのコマンドプロンプトで実行される一連のコマンドを含むスクリプトファイルです。これにより、複数のコマンドを一度に自動的に実行することができます。拡張子は「.bat」または「.cmd」となります。

この記事では、.ps1ファイルを実行するために使用します。

batファイルからps1スクリプトを呼び出す

事前準備

テキストファイルを新規作成し、「ToDoList.bat」に名前を変更します。

「ToDoList.ps1」は触られたくないので、移動しましょう。
「bin」フォルダを作成し、移動しました。

バッチファイルの編集

以下は、batファイルを使用してPowerShellスクリプトを呼び出す例です。

@echo off
powershell.exe -ExecutionPolicy RemoteSigned "C:\Users\Owner\Desktop\work\bin\ToDoList.ps1"

このbatファイルを実行すると、指定したPowerShellスクリプト(この例ではToDoList.ps1)が実行されます。-ExecutionPolicy Bypass オプションにより、実行ポリシーの制限を回避してスクリプトを実行することができます。

この方法を使用することで、PowerShellの実行ポリシーによる制限を気にせずに、スクリプトを簡単に実行することができます。
また、スクリプトの実行方法が分からなくても、batファイルであればダブルクリックで簡単に実行できます。

猫道
猫道

出来ました!完璧です!

上司
上司

ありがとう。早速使わせてもらうよ。

まとめと次のステップ

この記事では、PowerShellを用いてToDoリストのデータをファイルに保存する方法を学びました。具体的には、以下の内容を取り上げました。

  • データ永続性の重要性とその実現方法
  • PowerShellにおけるファイル操作の基本的な手法
  • ToDoリストのデータをファイルに保存・読み込む実装方法
  • 実行権限の制限を回避するためのbatファイルを用いた方法

これにより、プログラムを終了してもタスクのデータが失われることなく、次回も継続して使用することができるようになりました。

次回は、さらに実用的なToDoリストの作成に向けて、スクリプトの移植性を高めるためのテクニックを学びます。具体的には、「相対パスを利用した移植性の向上」に焦点を当て、どの環境でも同じように動作するスクリプトの作成方法を解説します。さらに実践的な知識を深めていきましょう。

ToDoリスト作成
シェアする
猫道をフォローする
この記事を書いた人
猫道

異業種からの転職を経て、システムエンジニアとして7年以上働いてきました。PowerShellを使いながら、プログラミングの魅力を共有したいと思っています。

猫道をフォローする

コメント

タイトルとURLをコピーしました