実行すると自分自身を削除するスクリプト。 処理終了後に不要になるので削除したい場合などに使います。
今回、「.bat .ps1 .vbs スクリプト」それぞれの自分自身を削除する記述方法と、実行中にスクリプトを編集するとどうなるかを検証しました。
作成するサンプルは共通の動きをします。
- ファイル一覧を表示
- 10秒待つ
- 自分自身を削除
- 再度ファイル一覧を表示
検証の内容を記載しているので、長々と書いております。
結果だけ知りたい場合は、最後のまとめをご覧ください。
検証などを行う場合は、実行すると実行したファイルは消えるのでバックアップを取ってから実行してください。
.bat の検証
用意した検証ファイル(SelfDel.bat)の中身は以下のとおり
dir
timeout.exe /T 10 /NOBREAK > nul
rem del /F "%~dp0%~nx0"
dir
削除がコメントアウトされた状態で結果確認します。
E:\Work>SelfDel.bat
E:\Work>dir
ドライブ E のボリューム ラベルは TEST です
ボリューム シリアル番号は FC25-C3C9 です
E:\Work のディレクトリ
2025/07/01 10:55 <DIR> .
2025/07/01 10:55 <DIR> ..
2025/07/01 10:51 75 SelfDel.bat
1 個のファイル 75 バイト
2 個のディレクトリ 60,047,187,968 バイトの空き領域
E:\Work>timeout.exe /T 10 /NOBREAK 1>nul
E:\Work>rem del /F "E:\Work\SelfDel.bat"
E:\Work>dir
ドライブ E のボリューム ラベルは TEST です
ボリューム シリアル番号は FC25-C3C9 です
E:\Work のディレクトリ
2025/07/01 10:55 <DIR> .
2025/07/01 10:55 <DIR> ..
2025/07/01 10:51 75 SelfDel.bat
1 個のファイル 75 バイト
2 個のディレクトリ 60,047,187,968 バイトの空き領域
E:\Work>
ファイル一覧表示、10秒待ち、ファイル一覧表示と動きました。 次に削除のコメントアウトを外します。
dir
timeout.exe /T 10 /NOBREAK > nul
del /F "%~dp0%~nx0"
dir
実行結果を確認します。
E:\Work>SelfDel.bat
E:\Work>dir
ドライブ E のボリューム ラベルは TEST です
ボリューム シリアル番号は FC25-C3C9 です
E:\Work のディレクトリ
2025/07/01 10:55 <DIR> .
2025/07/01 10:55 <DIR> ..
2025/07/01 10:57 71 SelfDel.bat
1 個のファイル 71 バイト
2 個のディレクトリ 60,047,187,968 バイトの空き領域
E:\Work>timeout.exe /T 10 /NOBREAK 1>nul
E:\Work>del /F "E:\Work\SelfDel.bat"
バッチ ファイルが見つかりません。
E:\Work>
自分自身を消した後の dir コマンドが実行されず、「バッチ ファイルが見つかりません。」と表示されています。
ファイルが消えたことで消えた以降のコマンドが読めなくなったようです。
では、10秒待っている間にコマンドを追加するとどうなるでしょうか?
echo で画面にコマンド追加と表示してみます。
dir
timeout.exe /T 10 /NOBREAK > nul
echo コマンド追加
del /F "%~dp0%~nx0"
dir
実行後の10秒待ちのタイミングでファイルに追記して保存します。
E:\Work>SelfDel.bat
E:\Work>dir
ドライブ E のボリューム ラベルは TEST です
ボリューム シリアル番号は FC25-C3C9 です
E:\Work のディレクトリ
2025/07/01 11:00 <DIR> .
2025/07/01 11:00 <DIR> ..
2025/07/01 10:57 71 SelfDel.bat
1 個のファイル 71 バイト
2 個のディレクトリ 60,047,187,968 バイトの空き領域
E:\Work>timeout.exe /T 10 /NOBREAK 1>nul
E:\Work>echo コマンド追加
コマンド追加
E:\Work>del /F "E:\Work\SelfDel.bat"
バッチ ファイルが見つかりません。
E:\Work>
実行中に追加したコマンドが実行されていました。
.ps1 の検証
用意した検証ファイル(SelfDel.ps1)の中身は以下のとおり
Get-ChildItem | Format-Table -AutoSize
Start-Sleep -Seconds 10
# Remove-Item -Path $MyInvocation.MyCommand.Path -Force
Get-ChildItem | Format-Table -AutoSize
※Get-ChildItemを2回続けて実行すると以下のように表示され、2回実行されたことがわかりにくいので、Format-Table -AutoSize を付けています。
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2025/07/01 11:14 118 SelfDel.ps1
-a---- 2025/07/01 11:14 118 SelfDel.ps1
削除がコメントアウトされた状態で結果確認します。
実効ポリシーは実行時Bypassにして実行しています。
PS E:\work> Set-ExecutionPolicy Bypass -Scope Process -Force; .\SelfDel.ps1
ディレクトリ: E:\work
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2025/07/01 11:14 118 SelfDel.ps1
-a---- 2025/07/01 11:14 118 SelfDel.ps1
PS E:\work> Set-ExecutionPolicy Bypass -Scope Process -Force; .\SelfDel.ps1
ディレクトリ: E:\work
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2025/07/01 11:17 168 SelfDel.ps1
ディレクトリ: E:\work
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2025/07/01 11:17 168 SelfDel.ps1
PS E:\work>
ファイル一覧表示、10秒待ち、ファイル一覧表示と動きました。
次に削除のコメントアウトを外します。
Get-ChildItem | Format-Table -AutoSize
Start-Sleep -Seconds 10
Remove-Item -Path $MyInvocation.MyCommand.Path -Force
Get-ChildItem | Format-Table -AutoSize
実行結果を確認します。
PS E:\work> Set-ExecutionPolicy Bypass -Scope Process -Force; .\SelfDel.ps1
ディレクトリ: E:\work
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2025/07/01 11:23 166 SelfDel.ps1
PS E:\work>
自分自身を消した後の Get-ChildItem コマンドが実行されず、なにも表示されませんでした。
.batと同じように以降実行されませんが、エラーが出ないのでそこでファイルも終了になっているようです。
では、10秒待っている間にコマンドを追加するとどうなるでしょうか?
Write-Output で画面にコマンド追加と表示してみます。
Get-ChildItem | Format-Table -AutoSize
Start-Sleep -Seconds 10
Write-Output コマンド追加
Remove-Item -Path $MyInvocation.MyCommand.Path -Force
Get-ChildItem | Format-Table -AutoSize
追加したコマンドが表示されませんでした。 何度か試しても同じ結果。
PS E:\work> Set-ExecutionPolicy Bypass -Scope Process -Force; .\SelfDel.ps1
ディレクトリ: E:\work
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2025/07/01 11:23 166 SelfDel.ps1
PS E:\work>
試しに実行前にWrite-Outputを記述しておき、10秒待ちの時に消してみます。
PS E:\work> Set-ExecutionPolicy Bypass -Scope Process -Force; .\SelfDel.ps1
ディレクトリ: E:\work
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 2025/07/01 11:34 195 SelfDel.ps1
コマンド追加
PS E:\work>
消したコマンドが実行されていました。
ファイルが消えるまでは変更前のファイル通りに動作し、消えるとそれ以後が実行されませんでした。
.vbs の検証
用意した検証ファイル(SelfDel.vbs)の中身は以下のとおり
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set colFiles = objFSO.GetFolder(".\").Files
WScript.Echo "更新日時" & vbTab & vbTab & "サイズ" & vbTab & "ファイル名"
For Each objFile in colFiles
WScript.Echo objFile.DateCreated & vbTab & objFile.Size & vbTab & objFile.Name
Next
WScript.Sleep 10000
'objFSO.DeleteFile WScript.ScriptFullName, True
Set colFiles = objFSO.GetFolder(".\").Files
WScript.Echo "更新日時" & vbTab & vbTab & "サイズ" & vbTab & "ファイル名"
For Each objFile in colFiles
WScript.Echo objFile.DateCreated & vbTab & objFile.Size & vbTab & objFile.Name
Next
削除がコメントアウトされた状態で結果確認します。
.bat .ps1 と比較しやすいように、wscript.exe ではなく cscript.exe で実行します。
E:\Work>cscript.exe SelfDel.vbs
Microsoft (R) Windows Script Host Version 5.812
Copyright (C) Microsoft Corporation. All rights reserved.
更新日時 サイズ ファイル名
2025/07/01 11:39:10 619 SelfDel.vbs
更新日時 サイズ ファイル名
2025/07/01 11:39:10 619 SelfDel.vbs
E:\Work>
ファイル一覧表示、10秒待ち、ファイル一覧表示と動きました。
次に削除のコメントアウトを外します。
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set colFiles = objFSO.GetFolder(".\").Files
WScript.Echo "更新日時" & vbTab & vbTab & "サイズ" & vbTab & "ファイル名"
For Each objFile in colFiles
WScript.Echo objFile.DateCreated & vbTab & objFile.Size & vbTab & objFile.Name
Next
WScript.Sleep 10000
objFSO.DeleteFile WScript.ScriptFullName, True
Set colFiles = objFSO.GetFolder(".\").Files
WScript.Echo "更新日時" & vbTab & vbTab & "サイズ" & vbTab & "ファイル名"
For Each objFile in colFiles
WScript.Echo objFile.DateCreated & vbTab & objFile.Size & vbTab & objFile.Name
Next
実行結果を確認します。
E:\Work>cscript.exe SelfDel.vbs
Microsoft (R) Windows Script Host Version 5.812
Copyright (C) Microsoft Corporation. All rights reserved.
更新日時 サイズ ファイル名
2025/07/01 11:39:10 618 SelfDel.vbs
更新日時 サイズ ファイル名
E:\Work>
自分自身を消した後も最後まで実行されました。
ファイルが消えているので、2回目のファイル一覧表示にファイル名はありません。
ファイルが消えたことは影響していないようです。
では、10秒待っている間にコマンドを追加するとどうなるでしょうか?
WScript.Echo で画面にコマンド追加と表示してみます。
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set colFiles = objFSO.GetFolder(".\").Files
WScript.Echo "更新日時" & vbTab & vbTab & "サイズ" & vbTab & "ファイル名"
For Each objFile in colFiles
WScript.Echo objFile.DateCreated & vbTab & objFile.Size & vbTab & objFile.Name
Next
WScript.Sleep 10000
WScript.Echo "コマンド追加"
objFSO.DeleteFile WScript.ScriptFullName, True
Set colFiles = objFSO.GetFolder(".\").Files
WScript.Echo "更新日時" & vbTab & vbTab & "サイズ" & vbTab & "ファイル名"
For Each objFile in colFiles
WScript.Echo objFile.DateCreated & vbTab & objFile.Size & vbTab & objFile.Name
Next
追加したコマンドが表示されませんでした。
E:\Work>cscript.exe SelfDel.vbs
Microsoft (R) Windows Script Host Version 5.812
Copyright (C) Microsoft Corporation. All rights reserved.
更新日時 サイズ ファイル名
2025/07/01 11:42:44 618 SelfDel.vbs
更新日時 サイズ ファイル名
E:\Work>
試しに実行前にWScript.Echoを記述しておき、10秒待ちの時に消してみます。
E:\Work>cscript.exe SelfDel.vbs
Microsoft (R) Windows Script Host Version 5.812
Copyright (C) Microsoft Corporation. All rights reserved.
更新日時 サイズ ファイル名
2025/07/01 11:43:47 651 SelfDel.vbs
コマンド追加
更新日時 サイズ ファイル名
E:\Work>
消したコマンドが実行されていました。
実行開始時の状態で実行されるようで、ファイルを消しても途中でファイルを編集しても反映しませんでした。
スクリプト中で自分自身を削除する記述方法と実行中に編集したときの動きのまとめです。
.bat
del /F "%~dp0%~nx0"
ファイルを削除すると、削除以降実行されなかった。 実行中にファイルを編集すると、まだ実行されていない部分は編集内容が反映した。
.ps1
Remove-Item -Path $MyInvocation.MyCommand.Path -Force
ファイルを削除すると、削除以降実行されなかった。 実行中にファイルを編集しても、自分自身の削除以後の編集内容は反映しなかった。
.vbs
Set objFSO = CreateObject("Scripting.FileSystemObject") objFSO.DeleteFile WScript.ScriptFullName, True
ファイルを削除しても、削除以降の最後まで実行された。 実行中にファイルを編集しても、編集内容は反映しなかった。