在 ForEach 查询中修剪

问题描述

在我的家庭实验室中,我尝试使用 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:\ProgramFiles\Tools\Test.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 否则
日期时间 一个 [DateTime] 对象(就像你用 (Get-Date) 得到的)
Int32 一个有符号的 32 位整数 (-2147483648..2147483647)
UInt32 无符号 32 位整数 (0..4294967295)
DayOfWeek[] 一个字符串数组,如'Sunday'、'Monday'、'Tuesday'、'Wednesday'、'Thursday'、'Friday'、'Saturday'
时间跨度 一个 [TimeSpan] 对象,就像您将两个 [DateTime] 对象相减或 New-TimeSpan cmdlet 的结果相减时得到的

最后,运行 cmdlet

New-ScheduledTaskTrigger @$TriggerParams
,

好吧,在您的函数中,$TriggerParams 的每个实例都包含一个反引号:

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

删除它不会解决您的问题吗?