Powershell将筛选器应用于日期小时分钟筛选器

Powershell将筛选器应用于日期小时分钟筛选器,powershell,Powershell,下面的命令运行良好,并给出结果-使用powershell Invoke-DbaWhoIsActive -SqlInstance prod | Select-object 'dd hh:mm:ss.mss', login_name, wait_info, host_name, sql_text dd hh:mm:ss.mss : 00 02:36:54.540 login_name : sa wait_info : host_name : Prod sql

下面的命令运行良好,并给出结果-使用powershell

Invoke-DbaWhoIsActive -SqlInstance prod  | Select-object 'dd hh:mm:ss.mss',  login_name, wait_info, host_name, sql_text

dd hh:mm:ss.mss : 00 02:36:54.540
login_name      : sa
wait_info       : 
host_name       : Prod
sql_text        : <?query --
                  begin tran
                  --?>
调用dbawoisactive-SqlInstance prod |选择对象'dd hh:mm:ss.mss',登录名,等待信息,主机名,sql文本
dd hh:mm:ss.mss:00 02:36:54.540
登录名:sa
等待信息:
主机名:Prod
sql_文本:
如何将筛选器应用于dd hh:mm:ss.mss-仅显示大于15分钟的结果。

尝试以下操作:

Invoke-DbaWhoIsActive -SqlInstance prod  | Select-object @{n='dd hh:mm:ss.mss';e={if(($_.'dd hh:mm:ss.mss'.tostring().split(" ")[1]).split(":")[0])-gt15){$_.'dd hh:mm:ss.mss'}}},login_name, wait_info, host_name, sql_text

您可以将
dd hh:mm:ss.mss
属性值作为实例进行分析,然后(通过cmdlet)可以根据其
.TotalMinutes
属性进行筛选:


上面用句点(
)替换字符串(如
00 02:36:54.540
)中的空格,这将生成一个字符串,您可以直接将其转换为
[timespan]

对于列标题来说,这是一个多么可怕的名称。这就是说,这应该实现你的目标

Invoke-DbaWhoIsActive -SqlInstance prod |
    Where-Object {($_.'dd hh:mm:ss.mss' -split ':')[1] -gt 15} |
        Select-object 'dd hh:mm:ss.mss',  login_name, wait_info, host_name, sql_text
只需在冒号处拆分属性
'dd hh:mm:ss.mss'
,抓取第二个元素
[1]
,如果它大于15,将传递到select object语句

这里有一个小测试,你可以运行

$var = @'
dd hh:mm:ss.mss
00 02:36:54.540
00 02:12:54.540
00 02:44:54.540
00 02:15:54.540
'@ | convertfrom-csv

$var | Where-Object {($_.'dd hh:mm:ss.mss' -split ':')[1] -gt 15}

我尝试使用timespan,但我想我缺少了用句点部分替换空格。干得好!但是我没有发现第一个示例代码和我发布的代码之间有任何区别,我只能看到您更改了比较运算符之间的空格,这不会有任何区别。顺便说一句,这是powershell中的正常行为[grin]在code golf中使用得太多了。我还看到你先用冒号分开,这会抓住前两个单词,所以比较可能会失败。因此,我建议您首先按空格分割,然后选择第二个空格(在数组1中),然后按:分割,然后选择0。Welcome@WasifHasan(我不是道格,OP):您的解决方案的根本区别在于,您的解决方案不过滤输入对象;相反,它会报告所有这些值,并且仅根据过滤条件清除值。另外,对于给定的字符串格式,如果只需要第二个标记,那么仅通过
进行拆分应该可以正常工作。但是,还有一个概念问题也会影响您的答案:鉴于前两位数字是天,例如,
'01 02:00:54.540'
将不会被视为代表15分钟以上的时间跨度,即使它显然是(小时也是如此)
$var = @'
dd hh:mm:ss.mss
00 02:36:54.540
00 02:12:54.540
00 02:44:54.540
00 02:15:54.540
'@ | convertfrom-csv

$var | Where-Object {($_.'dd hh:mm:ss.mss' -split ':')[1] -gt 15}