在ForEach查询中 Trim



在我的实验室中,我尝试使用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 &amp; 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方便,查看类型

<表类>类型指定SwitchParameter如果需要该参数,将其设置为布尔值$true。省略或设置为$false,否则DateTimea [DateTime] object(就像你得到的(Get-Date))Int32a有符号32位整数(-2147483648..2147483647)UInt32an Unsigned 32位整数(0..4294967295)DayOfWeek[]一个字符串数组,如'Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'TimeSpana [TimeSpan]对象,就像你从彼此减去两个[DateTime]对象或New-TimeSpancmdlet的结果一样

在你的函数中,$TriggerParams的每个实例都包含一个反勾号:

$TriggerParams.Add($("-" + "AtLogOn" + ' `').Trim()) 
^
Here

把这个去掉不就解决你的问题了吗?

最新更新