我试图让脚本在运行后自动删除,但我无法弄清楚脚本的结构。如果我手动运行它,我的脚本可以完美运行,但问题是我必须返回并手动删除我创建的任务。
我正在寻找一些有关如何让此脚本在运行(或超过 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
如果我还可以对如何从此处字符串外部调用变量有任何建议。我无法将单引号更改为双引号,因为这会导致身份验证错误。
要在脚本完成后删除任务,只需添加
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 退出。
阅读这篇有关参数验证的文章
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。创建远程任务调度器任务集过期并删除