PowerShell中如何实例化Register-ScheduledTask任务对象并后续修改属性
优化方案
你需要的逻辑可以通过PowerShell的**参数飞溅(Splatting)**特性实现,无需重复调用Set-ScheduledTask,只需要预先定义参数哈希表,在switch分支内根据逻辑填充对应参数,最后统一执行一次命令即可,修改后的完整代码如下:
#Requires -RunAsAdministrator # 脚本参数 [CmdletBinding(SupportsShouldProcess)] param ( [ValidateSet('askme', 'hardcoded', 'system')] [string]$taskrunner = 'system' ) # 屏幕输出额外信息 $VerbosePreference = "Continue" # 清屏 Clear-Host # 固定在脚本所在目录执行 Set-Location $PSScriptRoot " --- Running $($MyInvocation.Line) --- ** 关于脚本功能的葡萄牙语说明 ** Este script importa um xml (previamente exportado do agendador de tarefas) e agenda esta tarefa simulando um servico, dispensando o logon do usuario. --- " $taskname = 'sync-owncloud-as-a-service' $taskxml = (Get-Content "$taskname.xml" | Out-String) # 注册基础计划任务 Register-ScheduledTask -Force -TaskName $taskname -xml $taskxml # 初始化Set-ScheduledTask的参数哈希表,默认自带任务名参数 $setTaskParams = @{ TaskName = $taskname } switch ($taskrunner) { 'askme' { $credential = Get-Credential -Message '运行任务的账户凭证' -Title '--- 注意 ---' $setTaskParams['User'] = $credential.UserName $setTaskParams['Password'] = $credential.GetNetworkCredential().Password } 'hardcoded' { $setTaskParams['User'] = 'corp\nonprivilegeduser' $setTaskParams['Password'] = 'verystrongpassaword' # 提醒:硬编码明文密码存在极大安全风险,生产环境建议改为从加密存储读取 } 'system' { $setTaskParams['Principal'] = New-ScheduledTaskPrincipal -UserID "NT AUTHORITY\SYSTEM" -LogonType ServiceAccount -RunLevel Highest } Default { Write-Error "参数 $_ 不适用于本脚本" exit 1 } } # 统一执行计划任务修改操作 Set-ScheduledTask @setTaskParams # 输出任务信息(确认配置正确) Get-ScheduledTaskInfo $taskname
补充说明
- 参数飞溅的写法不仅消除了重复代码,后续如果需要给
Set-ScheduledTask新增通用参数(比如-WhatIf、-Verbose),只需要在$setTaskParams哈希表中添加一次即可,维护效率更高 - 如非必要不建议使用hardcoded分支,明文存储凭证会带来严重的安全风险
内容的提问来源于stack exchange,提问作者yodog
相关产品推荐
相关产品推荐

