Powershell 脚本可执行文件自毁?

时间:2021-01-10 03:44:20

标签: powershell

我正在使用 PS2EXE 将 .ps1 脚本转换为 exe。运行可执行文件后,我希望它自行删除。我曾尝试使用“-LiteralPath”和“$PSScriptRoot”,但都在运行时作为可执行文件返回 null。

感谢任何回复,谢谢。

1 个答案:

答案 0 :(得分:0)

在您的代码中...

  1. 在您的可执行文件启动时,创建一个计划任务(以执行 remove-item)以 记录事件时启动。使用现有的事件日志,或 create your own
  2. 在您的计划任务中,您分配您自己将编写的代码 到事件日志。
  3. 在您的代码中,完成后,您write to the event log
  4. 当您写入日志时,任务应该会触发。

...或者在您的代码中,创建一个计划任务(删除项目)作为您代码中的最后一个操作,例如在创建后 1 分钟执行。

根据我对您似乎遇到的路径问题的后续评论进行更新。

<块引用>

“你能举个例子吗?路径必须是它的当前路径 位置,在执行时可能是未知的。”

已测试 - 使用 PS2EXE 转换为可执行文件的示例代码。

注意: 有报道称,AV 解决方案现在正在警告这种类型的从 ps1 到 exe 用例的转换。

Powershell 脚本 hello.ps1 转换为 exe

# Get executable process path
$ExecutablePath = (Get-Process -ProcessName hello).path

# Check for an existing task
Function Remove-ExecutableTask
{
    Try   
    {
        Get-ScheduledTask -TaskName 'RemoveCurrentExecutable' -ErrorAction Stop
        Unregister-ScheduledTask -TaskName RemoveCurrentExecutable -Confirm:$false
    }  
    Catch {$PSItem.Exception.Message}
}

# Create Scheduled task
Function New-ExecutableTask
{
    $ExecutableAction = $(New-ScheduledTaskAction -Execute 'Powershell.exe' -Argument "-NoProfile -command & {Remove-Item -Path $ExecutablePath}")
    $Trigger          = New-ScheduledTaskTrigger -Once -At $("{0:hhtt}" -f (get-date).AddHours(1))
    Register-ScheduledTask -Action $ExecutableAction -Trigger $Trigger -TaskName 'RemoveCurrentExecutable' -Description 'Remove the target executable.'
}


Remove-ExecutableTask
New-ExecutableTask

'Hello World!'
"Hello World ran from: $ExecutablePath"

# Test run from the PowerShell consolehost and Results
<#
 Try{(Get-ChildItem -Path 'D:\temp\hello.exe' -ErrorAction Stop).FullName;&{D:\temp\hello.exe}}Catch{$PSItem.Exception.Message}
Cannot find path 'D:\temp\hello.exe' because it does not exist.

 Try{Get-ScheduledTask -TaskName 'RemoveCurrentExecutable' -ErrorAction Stop}Catch{$PSItem.Exception.Message}
No MSFT_ScheduledTask objects found with property 'TaskName' equal to 'RemoveCurrentExecutable'.  Verify the value of the property and retry.

 # Convert the script using PS2EXE and execute it

 Try{(Get-ChildItem -Path 'D:\temp\hello.exe' -ErrorAction Stop).FullName;&{D:\temp\hello.exe}}Catch{$PSItem.Exception.Message}
D:\temp\hello.exe

 Try{Get-ScheduledTask -TaskName 'RemoveCurrentExecutable' -ErrorAction Stop}Catch{$PSItem.Exception.Message}

TaskPath                                       TaskName                          State     
--------                                       --------                          -----     
\                                              RemoveCurrentExecutable           Ready     

(Get-ChildItem -Path D:\Temp\hello.exe).FullName
D:\Temp\hello.exe

 # Execute the scheduled task

 Start-ScheduledTask -TaskName RemoveCurrentExecutable

 Try{(Get-ChildItem -Path 'D:\temp\hello.exe' -ErrorAction Stop).FullName;&{D:\temp\hello.exe}}Catch{$PSItem.Exception.Message}
Cannot find path 'D:\temp\hello.exe' because it does not exist.
#>

当然我只是手动启动脚本,但它会在定义的时间执行。