Windows PowerShell で bak バックアップコマンドを登録する手順

Views: 1

1. はじめに

PowerShell で、作業中のファイルをすぐに退避できる簡単なバックアップ用コマンド bak を登録したいと思い、次のような機能を用意しました。

bak .\model\wuwei.model.js

これで、たとえば次のようなバックアップファイルを作ります。

.\model\wuwei.model.js.bak.202603071230

一見単純ですが、実際にやってみると次のようなところで何度かつまずきました。

  • notepad $PROFILE で「指定されたパスが見つかりません」

  • $PROFILE の場所にファイルを作ったが、中身が空で何を書けばよいのか分からない

  • Get-Command bak を実行しても bak が見つからない

  • . $PROFILE を実行すると「このシステムではスクリプトの実行が無効」

本記事では、これらの経緯も含めて、後から同じことをする人が困らないように、実際の失敗と対処をまとめます。

2. やりたいこと

登録したい bak コマンドは、引数に与えたファイルをタイムスタンプ付きでコピーするものです。

元になった考え方は、シェルでよく使う次のようなコマンドです。

cp -a some.js some.js.bak.$(date +%Y%m%d%H%M)

これを PowerShell では関数として登録します。

3. まず結論:登録する関数

まず、最終的にプロファイルへ書き込む内容は次です。

function bak {
    param(
        [Parameter(Mandatory = $true, Position = 0)]
        [string]$Path
    )

    if (-not (Test-Path -LiteralPath $Path)) {
        Write-Error "Not found: $Path"
        return
    }

    $timestamp = Get-Date -Format "yyyyMMddHHmm"
    Copy-Item -LiteralPath $Path -Destination "$Path.bak.$timestamp" -Recurse -Force
}

この関数は次のように動きます。

  • 指定したパスが存在するか確認する

  • 現在時刻を yyyyMMddHHmm 形式で取得する

  • ファイル名.bak.日時 の名前でコピーする

4. 手順 1: $PROFILE の場所を確認する

PowerShell では、起動時に読み込まれる自分用の設定ファイルを $PROFILE で確認できます。

$PROFILE

私の環境では次が返ってきました。

C:\Users\nobuy\OneDrive\ドキュメント\WindowsPowerShell\Microsoft.PowerShell_profile.ps1

ここで、すぐに次を実行しました。

notepad $PROFILE

しかし、次のエラーになりました。

メモ帳
指定されたパスが見つかりません。

5. エラー 1: notepad $PROFILE で「指定されたパスが見つかりません」

5.1. 原因

$PROFILE が指している「ファイル」だけでなく、その親フォルダ自体がまだ存在していなかったためです。

たとえば私のケースでは、次のフォルダがまだ無い状態でした。

C:\Users\nobuy\OneDrive\ドキュメント\WindowsPowerShell

5.2. 確認方法

まず親フォルダを確認します。

Split-Path -Parent $PROFILE

5.3. 対処

親フォルダを作成し、その後で空のプロファイルファイルも作成します。

New-Item -ItemType Directory -Path (Split-Path -Parent $PROFILE) -Force
New-Item -ItemType File -Path $PROFILE -Force

私の環境では次のように作成されました。

ディレクトリ: C:\Users\nobuy\OneDrive\ドキュメント

Mode   LastWriteTime         Length Name
----   -------------         ------ ----
d----- 2026/03/07 12:28             WindowsPowerShell
ディレクトリ: C:\Users\nobuy\OneDrive\ドキュメント\WindowsPowerShell

Mode   LastWriteTime         Length Name
----   -------------         ------ ----
-a---- 2026/03/07 12:28      0      Microsoft.PowerShell_profile.ps1

その後、改めて次を実行すると、今度は開けます。

notepad $PROFILE

6. エラー 2: メモ帳で開いたが、何も表示されない

6.1. 状況

notepad $PROFILE で開いたところ、ファイルは空でした。

6.2. 原因

これは異常ではありません。今作成したばかりの新規ファイルだからです。

6.3. 対処

空のファイルに、先ほどの bak 関数を書き込みます。

function bak {
    param(
        [Parameter(Mandatory = $true, Position = 0)]
        [string]$Path
    )

    if (-not (Test-Path -LiteralPath $Path)) {
        Write-Error "Not found: $Path"
        return
    }

    $timestamp = Get-Date -Format "yyyyMMddHHmm"
    Copy-Item -LiteralPath $Path -Destination "$Path.bak.$timestamp" -Recurse -Force
}

保存後、PowerShell に戻って次で内容を確認できます。

Get-Content $PROFILE

私の環境では、次のように正しく保存されていることを確認できました。

function bak {
    param(
        [Parameter(Mandatory = $true, Position = 0)]
        [string]$Path
    )

    if (-not (Test-Path -LiteralPath $Path)) {
        Write-Error "Not found: $Path"
        return
    }

    $timestamp = Get-Date -Format "yyyyMMddHHmm"
    Copy-Item -LiteralPath $Path -Destination "$Path.bak.$timestamp" -Recurse -Force
}

7. エラー 3: Get-Command bak を実行しても bak が見つからない

7.1. 状況

ファイルに関数を書いた後で、次を実行しました。

Get-Command bak

しかし、次のように表示されました。

Get-Command : 用語 'bak' は、コマンドレット、関数、スクリプト ファイル、または操作可能なプログラムの名前として認識されません。

7.2. 原因

プロファイルファイルに書いただけでは、今開いている PowerShell セッションにはまだ読み込まれていないためです。

7.3. 対処

次でプロファイルを読み込みます。

. $PROFILE

ここで注意点が 1 つあります。

  • 先頭の . はドットソース構文

  • .$PROFILE の間に半角スペースが必要

つまり、次の形です。

. $PROFILE

ところが、ここでさらに別のエラーに遭遇しました。

8. エラー 4: . $PROFILE で「このシステムではスクリプトの実行が無効」

8.1. 実際のメッセージ

. : このシステムではスクリプトの実行が無効になっているため、ファイル
C:\Users\nobuy\OneDrive\ドキュメント\WindowsPowerShell\Microsoft.PowerShell_profile.ps1
を読み込むことができません。
詳細については、「about_Execution_Policies」を参照してください。

8.2. 原因

PowerShell の実行ポリシーにより、.ps1 の実行が禁止されていたためです。

8.3. 対処 1: 今のセッションだけ有効にする

まずは安全に、現在の PowerShell セッションだけで有効にする方法です。

Set-ExecutionPolicy -Scope Process RemoteSigned

確認が出たら Y を入力します。

その後、再度プロファイルを読み込みます。

. $PROFILE

続けて確認します。

Get-Command bak

これで bak が関数として認識されるはずです。

8.4. 対処 2: 自分のユーザーに対して恒久的に有効にする

毎回 Set-ExecutionPolicy -Scope Process …​ を実行するのが面倒なら、現在のユーザーに対して恒久的に設定できます。

Set-ExecutionPolicy -Scope CurrentUser RemoteSigned

その後で、やはり次を実行します。

. $PROFILE
Get-Command bak

8.5. 現在の設定確認

次で実行ポリシーの一覧を確認できます。

Get-ExecutionPolicy -List

9. 実際に bak を使う

読み込みが成功したら、たとえば次のように使えます。

bak .\model\wuwei.model.js

すると、同じ場所に次のようなバックアップが作られます。

.\model\wuwei.model.js.bak.202603071230

存在しないファイルを指定した場合は、関数内の Test-Path によって次のようにエラーになります。

Not found: .\model\no_such_file.js

10. 最短手順まとめ

途中の失敗を飛ばして、最短で進めるなら次の手順です。

10.1. 1. プロファイルの親フォルダとファイルを作る

New-Item -ItemType Directory -Path (Split-Path -Parent $PROFILE) -Force
New-Item -ItemType File -Path $PROFILE -Force

10.2. 2. プロファイルを開く

notepad $PROFILE

10.3. 3. 次の関数を貼り付けて保存する

function bak {
    param(
        [Parameter(Mandatory = $true, Position = 0)]
        [string]$Path
    )

    if (-not (Test-Path -LiteralPath $Path)) {
        Write-Error "Not found: $Path"
        return
    }

    $timestamp = Get-Date -Format "yyyyMMddHHmm"
    Copy-Item -LiteralPath $Path -Destination "$Path.bak.$timestamp" -Recurse -Force
}

10.4. 4. このセッションだけ実行を許可する

Set-ExecutionPolicy -Scope Process RemoteSigned

10.5. 5. プロファイルを読み込む

. $PROFILE

10.6. 6. 確認する

Get-Command bak

10.7. 7. 使う

bak .\model\wuwei.model.js

11. なぜこうした段階的な確認が必要なのか

今回、同じところで何度かやり取りが往復したのは、PowerShell の「設定ファイルを作る」「そのファイルに関数を書く」「そのファイルを読み込む」「その前提としてスクリプト実行が許可されている」という段階が、まとめて一度に見えにくいためです。

実際には、次の 4 段階が順に成立している必要があります。

  1. $PROFILE が指す場所を知る

  2. 親フォルダと Microsoft.PowerShell_profile.ps1 が存在する

  3. そのファイルに bak 関数が保存されている

  4. PowerShell がその .ps1 を読み込める

どれか 1 つ欠けるだけでも、bak は使えるようになりません。

今回の失敗は、それぞれ次に対応していました。

段階 遭遇した症状 原因

1

notepad $PROFILE で「指定されたパスが見つかりません」

親フォルダが存在しなかった

2

メモ帳で開いても空だった

新規作成直後の空ファイルだった

3

Get-Command bak で見つからない

関数を書いたが、まだ読み込んでいない

4

. $PROFILE でスクリプト実行禁止エラー

実行ポリシーで .ps1 が禁止されていた

12. 補足: bak をもっと拡張したい場合

今回は最小構成の bak だけにしましたが、将来的には次のような拡張も考えられます。

  • 作業中ディレクトリ名の先頭 3 文字をバックアップ名に入れる

  • 複数ファイルをまとめて受け付ける

  • バックアップ先を別フォルダへ分ける

  • 既存の .bak.* 一覧を出す

ただし、まずは今回のように、確実に動く最小形で登録できることが重要です。

13. おわりに

PowerShell で簡単な関数を登録するだけでも、最初は

  • $PROFILE の実体がどこか

  • その親フォルダが存在するか

  • 保存した関数が実際に読み込まれているか

  • 実行ポリシーにブロックされていないか

といった確認が必要になります。

今回のように一つずつ確認していけば、途中で「何ができていて、何がまだできていないか」が切り分けられます。

同じように bak を登録しようとして、

  • メモ帳で開けない

  • 開けても空で戸惑う

  • 書いたのにコマンドが見つからない

  • 読み込もうとすると実行禁止になる

という流れで困った場合は、上記の順に確認していけば解決できます。


投稿日

カテゴリー:

投稿者:

タグ:

コメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です