将字符串转换为timepans,$ PSItem in'切换'?

时间:2016-01-12 12:43:30

标签: powershell

我有一堆字符串,形式为:

  

' 3m 36s' 24m 38s',' 59s'

,转换为时间跨度。我目前的解决方案"是:

'3m 36s', '24m 38s', '59s' |ForEach-Object {

    $s = 0
    $m = 0
    $h = 0
    $PSItem.Split(' ') |ForEach-Object {

        $item = $PSItem
        switch ($PSItem[-1])
        {
            's'
            {
                $s = $item.TrimEnd('s')
            }
            'm'
            {
                $m = $item.TrimEnd('m')
            }
            'h'
            {
                $h = $item.TrimEnd('h')
            }
            Default
            {
                Write-Error 'Ooops...' -ErrorAction Stop
            }
        }
    }

    $timespan = New-TimeSpan -Hours $h -Minutes $m -Seconds $s
    # ToString() is used just to get some easy to read output
    $timespan.ToString()
}

虽然它似乎对我有用,但上面有两个问题:

  1. 是一般方法
  2.   

    ForEach - >拆分('') - > ForEach - >开关

    行上下的?有没有其他/更好的方法进行转换?

    1. 我尝试在开关中使用$ PSItem
    2. 似乎交换机构造有自己的管道"

      # $item = $PSItem
      switch ($PSItem[-1])
      {
          's'
          {
              $PSItem
          }
      }
      

      - 在上面的$ PSItem评估到'(,' m',匹配的值)。究竟发生了什么? (internaly?)

1 个答案:

答案 0 :(得分:2)

我会通过使用ForEach命令执行该循环来取出一个Switch循环。这就是我最终的目标:

'3m 36s', '59s', '24m 38s' |%{
    $TSParams = @{}
    Switch($_.Split()){
        {$_[-1] -eq 's'}{$TSParams.Add('Seconds', ([int]$_.trim('s')))}
        {$_[-1] -eq 'm'}{$TSParams.Add('Minutes', ([int]$_.trim('m')))}
        {$_[-1] -eq 'h'}{$TSParams.Add('Hours', ([int]$_.trim('h')))}
    }
    New-TimeSpan @TSParams
}

对于每个字符串,它创建一个空的哈希表,然后循环遍历Split()方法的每个项目,为哈希表添加适当的时间。然后它将其splats到New-TimeSpan命令,并移动到ForEach循环中的下一个项目。我在本地尝试过它,并且当数字没有作为int转换时出现了一些问题,并且它试图将它们转换为DateTime,这就是我在上面的代码中输入它们的原因。