記事検索

検索ワードを入力してください。
Sky Tech Blog
自分​自身を​消すスクリプトと、​実行中の​スクリプト編集の​検証

自分​自身を​消すスクリプトと、​実行中の​スクリプト編集の​検証

バッチファイル(.bat)、PowerShellスクリプト(.ps1)、VBScript(.vbs)の各スクリプトが自分自身を削除する方法と、実行中にスクリプトを編集した場合の挙動についての検証結果を説明しています。各スクリプトの動作を比較し、削除後の挙動や実行中の編集がどのように反映されるかを詳細に記載しています。

実行すると自分自身を削除するスクリプト。 処理終了後に不要になるので削除したい場合などに使います。

今回、「.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

ファイルを削除しても、削除以降の最後まで実行された。 実行中にファイルを編集しても、編集内容は反映しなかった。


\シェアをお願いします!/
  • X
  • Facebook
  • LINE
キャリア採用募集中!

入社後にスキルアップを目指す若手の方も、ご自身の経験を幅広いフィールドで生かしたいベテランの方も、お一人おひとりの経験に応じたキャリア採用を行っています。

Sky株式会社のソフトウェア開発や製品、採用に関するお問い合わせについては、下記のリンクをご確認ください。
お問い合わせ
ホーム