任何时候你都可以开始做自己想做的事

搜索|
powershell 脚本自删所在目录 自删除
发布时间:2025-01-02 08:33:03

# 获取脚本所在目录

$scriptDir = Split-Path -Parent $MyInvocation.MyCommand.Path


# 输出脚本所在目录,用于调试

Write-Output "Script Directory: $scriptDir"
# 启动新的powershell进程,后台进行删除操作

Start-Process powershell.exe -ArgumentList "-NoProfile -Command `"Start-Sleep -Seconds 5; Remove-Item '$scriptDir' -Recurse -Force`"" -WindowStyle Hidden -Wait

#-Wait 参数是指原始脚本等待新进程启动后再执行后面的代码,避免新进程还没启动,就执行后面的退出,导致自删失败

#带输出日志

#Start-Process powershell.exe -ArgumentList "-NoProfile -Command `"Start-Sleep -Seconds 5; Remove-Item '$scriptDir' -Recurse -Force; 'Deletion completed at:' + (Get-Date) | Out-File -FilePath D:\logfile.txt -Append`"" -WindowStyle Hidden -Wait

exit


Start-Process cmdlet

这是 PowerShell 中用于启动新进程的 cmdlet。它允许你指定要运行的程序、传递给该程序的参数以及其他选项。


参数说明

powershell.exe:

这是你要启动的进程名称。在这个例子中,我们正在启动一个新的 PowerShell 实例。

-ArgumentList 或 -Args:

这个参数指定了要传递给新启动进程的参数列表。对于 powershell.exe 来说,这些参数就是你想要在新的 PowerShell 会话中执行的命令或脚本。

注意到这里的值被包裹在双引号中,并且内部的双引号使用了反引号(`)进行转义,以确保它们不会提前结束外部的字符串。

"-NoProfile":

这个参数告诉 PowerShell 不要加载用户配置文件(如 $PROFILE 文件)。这可以加快启动速度,因为避免了读取和应用个人设置的过程。

"-Command":

指定接下来的内容是要执行的一条或多条命令。你可以在这里提供一个完整的命令行,或者是一个简单的表达式。在这个例子中,它包含了几个语句,通过分号 (;) 分隔。

"Start-Sleep -Seconds 5;":

这是在新的 PowerShell 进程启动后,先暂停5秒钟。这样做是为了确保原始脚本已经完全退出,所有资源都被释放,以便新的进程可以安全地删除目标目录。

"Remove-Item '$scriptDir' -Recurse -Force;":

这个命令用于递归地(-Recurse)强制删除(-Force)指定路径下的所有项目,包括只读文件等。$scriptDir 是之前定义的变量,代表脚本所在的目录。

"'Deletion completed at:' + (Get-Date) | Out-File -FilePath D:\logfile.txt -Append":

这部分代码创建了一条日志消息,包含当前时间戳,并将其追加写入到指定的日志文件中(D:\logfile.txt)。这可以帮助确认删除操作是否成功完成。

-WindowStyle Hidden:

设置新启动的 PowerShell 窗口样式为隐藏(Hidden),这样就不会显示一个新的命令提示窗口,从而保持用户体验的整洁。

-Wait:

告诉 Start-Process 在启动新进程后等待其完成再继续执行后续命令。这意味着原始脚本会在新进程结束后才继续往下执行(在这个例子中,由于后面有 exit,所以实际上原始脚本会在此处终止)。

通过这些参数,这个命令有效地创建了一个新的 PowerShell 进程来执行一系列任务:等待几秒钟,然后尝试删除指定目录,并记录删除操作的时间。所有这一切都在后台静默完成,不打扰用户。