我有一堆字符串,形式为:
' 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()
}
虽然它似乎对我有用,但上面有两个问题:
ForEach - >拆分('') - > ForEach - >开关
行上下的?有没有其他/更好的方法进行转换?
似乎交换机构造有自己的管道"
# $item = $PSItem
switch ($PSItem[-1])
{
's'
{
$PSItem
}
}
- 在上面的$ PSItem评估到'(,' m',匹配的值)。究竟发生了什么? (internaly?)
答案 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,这就是我在上面的代码中输入它们的原因。