Views: 1
Windows PowerShell で bak バックアップコマンドを登録する手順と、私が実際に遭遇したエラー
2026-03-07
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 段階が順に成立している必要があります。
-
$PROFILEが指す場所を知る -
親フォルダと
Microsoft.PowerShell_profile.ps1が存在する -
そのファイルに
bak関数が保存されている -
PowerShell がその
.ps1を読み込める
どれか 1 つ欠けるだけでも、bak は使えるようになりません。
今回の失敗は、それぞれ次に対応していました。
| 段階 | 遭遇した症状 | 原因 |
|---|---|---|
|
1 |
|
親フォルダが存在しなかった |
|
2 |
メモ帳で開いても空だった |
新規作成直後の空ファイルだった |
|
3 |
|
関数を書いたが、まだ読み込んでいない |
|
4 |
|
実行ポリシーで |
12. 補足: bak をもっと拡張したい場合
今回は最小構成の bak だけにしましたが、将来的には次のような拡張も考えられます。
-
作業中ディレクトリ名の先頭 3 文字をバックアップ名に入れる
-
複数ファイルをまとめて受け付ける
-
バックアップ先を別フォルダへ分ける
-
既存の
.bak.*一覧を出す
ただし、まずは今回のように、確実に動く最小形で登録できることが重要です。
13. おわりに
PowerShell で簡単な関数を登録するだけでも、最初は
-
$PROFILEの実体がどこか -
その親フォルダが存在するか
-
保存した関数が実際に読み込まれているか
-
実行ポリシーにブロックされていないか
といった確認が必要になります。
今回のように一つずつ確認していけば、途中で「何ができていて、何がまだできていないか」が切り分けられます。
同じように bak を登録しようとして、
-
メモ帳で開けない
-
開けても空で戸惑う
-
書いたのにコマンドが見つからない
-
読み込もうとすると実行禁止になる
という流れで困った場合は、上記の順に確認していけば解決できます。
- 1. はじめに
- 2. やりたいこと
- 3. まず結論:登録する関数
- 4. 手順 1:
$PROFILEの場所を確認する - 5. エラー 1:
notepad $PROFILEで「指定されたパスが見つかりません」 - 6. エラー 2: メモ帳で開いたが、何も表示されない
- 7. エラー 3:
Get-Command bakを実行してもbakが見つからない - 8. エラー 4:
. $PROFILEで「このシステムではスクリプトの実行が無効」 - 9. 実際に
bakを使う - 10. 最短手順まとめ
- 11. なぜこうした段階的な確認が必要なのか
- 12. 補足:
bakをもっと拡張したい場合 - 13. おわりに


コメントを残す