在我的实验室中,我尝试使用PowerShell自动执行计划任务。我使用[System.Collections.Generic]。List[String]集合所有要执行的开关列表。但是我无法删除'在我输出的最后一行?有人知道怎么解决这个问题吗?
-AtLogOn `
-AtStartup `
-Daily `
-DaysInterval 3 `
-DaysOfWeek Sunday, Monday `
-Once `
-RandomDelay (new-Timespan -Minutes 15) `
-RepetitionDuration (new-Timespan -Minutes 15) `
-RepetitionInterval (new-Timespan -Minutes 15) `
-Weekly `
-WeeksInterval 2 `
-At 3am `
下面是生成输出的代码:
$xml = [xml]@'
<Test>
<App TaskName = "LAB" Active = "True" >
<Task Name = "ScheduledTask" Active = "True" Order = "1" Description = "" TaskName = "" Execute = "Powershell.exe" Argument = "-command & D:ProgramFilesToolsTest.ps1 -Application" WorkingDirectory = "" AtLogOn = "1" AtStartup = "1" Daily = "1" DaysInterval = "3" DaysOfWeek = "Sunday, Monday" Once = "1" RandomDelay = "(new-Timespan -Minutes 15)" RepetitionDuration = "(new-Timespan -Minutes 15)" RepetitionInterval = "(new-Timespan -Minutes 15)" Weekly = "1" WeeksInterval = "2" At = "3am" />
</App>
</Test>
'@
If($($xml.Test.App.Active) -eq "True") {
ForEach($ActiveTask in $xml.Test.App.Task | Sort-Object Order | Where-Object { $_.Active -eq "True" }){
Switch($ActiveTask.Name){
ScheduledTask {
$TriggerParams = [System.Collections.Generic.List[String]]@()
If ($TriggerParams.Count -gt 0) { $TriggerParams.Clear() }
If ($ActiveTask.AtLogOn -eq "1"){
$TriggerParams.Add($("-" + "AtLogOn" + ' `').Trim())
}
If ($ActiveTask.AtStartup -eq "1"){
$TriggerParams.Add($("-" + "AtStartup" + ' `').Trim())
}
If ($ActiveTask.Daily -eq "1"){
$TriggerParams.Add($("-" + "Daily" + ' `').Trim())
}
If ($ActiveTask.DaysInterval -ne ""){
$TriggerParams.Add($("-" + "DaysInterval " + $ActiveTask.DaysInterval + ' `').Trim())
}
If ($ActiveTask.DaysOfWeek -ne ""){
$TriggerParams.Add($("-" + "DaysOfWeek " + $ActiveTask.DaysOfWeek + ' `').Trim())
}
If ($ActiveTask.Once -eq "1"){
$TriggerParams.Add($("-" + "Once" + ' `').Trim())
}
If ($ActiveTask.RandomDelay -ne ""){
$TriggerParams.Add($("-" + "RandomDelay " + $ActiveTask.RandomDelay + ' `').Trim())
}
If ($ActiveTask.RepetitionDuration -ne ""){
$TriggerParams.Add($("-" + "RepetitionDuration " + $ActiveTask.RepetitionDuration + ' `').Trim())
}
If ($ActiveTask.RepetitionInterval -ne ""){
$TriggerParams.Add($("-" + "RepetitionInterval " + $ActiveTask.RepetitionInterval + ' `').Trim())
}
If ($ActiveTask.Weekly -eq "1"){
$TriggerParams.Add($("-" + "Weekly" + ' `').Trim())
}
If ($ActiveTask.WeeksInterval -ne ""){
$TriggerParams.Add($("-" + "WeeksInterval " + $ActiveTask.WeeksInterval + ' `').Trim())
}
If ($ActiveTask.At -ne ""){
$TriggerParams.Add($("-" + "At " + $ActiveTask.At + ' `').Trim())
}
$TriggerParams
#$TaskTrigger = Invoke-Expression "New-ScheduledTaskTrigger $TriggerParams"
}
}
}
}
欢呼,Cpt
正如mklement0已经评论的那样,设置一个哈希表,并在带有大量参数的cmdlet上使用Splatting。
用
代替$TriggerParams = [System.Collections.Generic.List[String]]@()
$TriggerParams = @{}
不使用$TriggerParams.Add($("-" + "AtStartup" + ' `').Trim())
添加参数,使用
$TriggerParams["AtStartup"] = $true
保持页面New-ScheduledTaskTrigger方便,查看类型
$true
。省略或设置为$false
,否则(Get-Date)
)New-TimeSpan
cmdlet在你的函数中,$TriggerParams的每个实例都包含一个反勾号:
$TriggerParams.Add($("-" + "AtLogOn" + ' `').Trim())
^
Here
把这个去掉不就解决你的问题了吗?