具有自动删除功能的任务计划程序脚本

问题描述 投票:0回答:2

我试图让脚本在运行后自动删除,但我无法弄清楚脚本的结构。如果我手动运行它,我的脚本可以完美运行,但问题是我必须返回并手动删除我创建的任务。

我正在寻找一些有关如何让此脚本在运行(或超过 30 天)后自动删除自身的指导。

这是当前完整的脚本:

$Trigger = New-ScheduledTaskTrigger -Once -At "01/11/2023 23:40:00"
$User = "domain\user"
$TaskName = $User,(Get-Date -Format "dd-MM-yyyy HH-mm-ss")
$command = @'
[System.Net.ServicePointManager]::SecurityProtocol = 
[System.Net.SecurityProtocolType]::Tls12
$userName = '[email protected]'
$passwordText = Get-Content C:\Users\User\Secure.txt
$securePwd = $passwordText | ConvertTo-SecureString
$credObject = New-Object System.Management.Automation.PSCredential -ArgumentList 
$userName, $securePwd
connect-exchangeonline -Credential $credObject 
Remove-MailboxFolderPermission -Identity [email protected]:\Calendar -User 
[email protected] -Confirm:$false
$printConfig = (Get-ScheduledTask -TaskName Remove-Config).Triggers.StartBoundary
Write-Host Removed at $printConfig
'@
# Encode command to base-64
$commandBytes = [System.Text.Encoding]::Unicode.GetBytes( $command )
$commandBase64 = [Convert]::ToBase64String( $commandBytes )
$Action= New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-NoExit - 
EncodedCommand $commandBase64"
Register-ScheduledTask -TaskName "$TaskName" -Trigger $Trigger -User $User -Action 
$Action -RunLevel Highest –Force

如果我还可以对如何从此处字符串外部调用变量有任何建议。我无法将单引号更改为双引号,因为这会导致身份验证错误。

powershell herestring
2个回答
3
投票

要在脚本完成后删除任务,只需添加

Unregister-ScheduledTask
作为
$command = @'
块的最后一行。

Unregister-ScheduledTask -TaskName 'Remove-Config' -Confirm:$false

“或+30天”-想到的唯一可靠的方法是使用一个单独的计划任务,该任务在30天后运行,查找/删除第一个任务,然后删除它本身。


有多种传递参数的方法,例如通过编码命令将复杂参数传递给 powershell 脚本,但我不喜欢 - 在我看来,它不必要地复杂。

一个小的替代方案是在文件系统上使用 .ps1 文件,它更简单。包含 .ps1 文件的

Param
块第一行(可能使用默认选项,添加验证规则等),然后将脚本文件和任何其他参数作为参数传递给 powershell。

一个简单的演示 - 创建一个文件 c: emp rgtest.ps1

Param([String] $UserName = '[email protected]')
Start-Transcript -Path c:\temp\log-file.txt -Append
write-Host "Logging in as $UserName";

然后执行powershell并仅传递脚本文件,它将使用param块中的默认参数:

PS C:\Users\user> powershell.exe -file c:\temp\argtest.ps1

Transcript started, output file is C:\temp\log-file.txt
Logging in as [email protected]

或从命令行覆盖 UserName 变量:

PS C:\temp> powershell.exe -file c:\temp\argtest.ps1 -UserName '[email protected]'

Transcript started, output file is C:\temp\log-file.txt
Logging in as [email protected]

您可以将此应用到

New-ScheduledTaskAction
,这样
-Argument "-NoExit -EncodedCommand $commandBase64"
就会变成
-Argument "-file c:\temp\argtest.ps1 -UserName [email protected]


备注:

Start-Transcript -Path C:\temp\log-file.txt
计划任务函数内部对于捕获脚本的输出并将其写入文件很有用。

不要将密码等敏感数据作为 powershell 的参数 - 它们将在进程列表中可见,直到 powershell 退出。

阅读这篇有关参数验证的文章


0
投票

是的,您可以自行删除计划任务。您必须将

New-ScheduledTaskTrigger
EndBoundary
添加到触发器,这将自动删除计划任务。使用
AddDays()
方法
Get-Date
来实现这一点。

此外,请确保为

ToString("s")
附加
EndBoundary
方法,以将日期对象转换为
predefined format (ISO 5901)

示例:

$trigger = New-ScheduledTaskTrigger -Once -At (Get-Date).AddSeconds(10)
$trigger.EndBoundary = (Get-Date).AddDays(30).ToString("s")

在此处阅读更多示例:Powershell v4。创建远程任务调度器任务集过期并删除

© www.soinside.com 2019 - 2024. All rights reserved.