我正在使用 PS2EXE 将 .ps1 脚本转换为 exe。运行可执行文件后,我希望它自行删除。我曾尝试使用“-LiteralPath”和“$PSScriptRoot”,但都在运行时作为可执行文件返回 null。
感谢任何回复,谢谢。
答案 0 :(得分:0)
在您的代码中...
...或者在您的代码中,创建一个计划任务(删除项目)作为您代码中的最后一个操作,例如在创建后 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.
#>
当然我只是手动启动脚本,但它会在定义的时间执行。