我有一个数组通过管道传输到 PowerShell 中。尝试选择今天到接下来 3 周内匹配的内容。
1/4/2023 First Last
1/11/2023 First Last
1/19/2023 First Last
1/25/2023 First Last
2/1/2023 First Last
2/8/2023 First Last
2/15/2023 First Last
2/22/2023 First Last
3/1/2023 First Last
3/8/2023 First Last
预期结果是:
1/19/2023 First Last
1/25/2023 First Last
2/1/2023 First Last
2/8/2023 First Last
试图修改它以获得结果,但没有得到我需要的。
$referenceDate = (Get-Date).AddDays(21)
Get-Content -Path 'Dates.ini' |
Where-Object { $_ -match '^(\d{2}/\d{2}/\d{4})' } |
Where-Object { [datetime]::ParseExact($matches[1], 'MM/dd/yyyy', $null) -gt $referenceTime } |
ForEach-Object {
$_
#DO SOMETHING.. For demo just output the line(s) that matched
}
我的 PowerShell kung foo 并不强,非常感谢您的回答...
详细列出。 PowerShell 版本是 Server 2019 的默认版本。
最佳答案
我肯定会考虑使用 switch
这里带有 -Regex
标志:
$referenceDate = (Get-Date).AddDays(21)
switch -Regex -File Dates.ini {
'^(?:\d{1,2}/){2}\d{4}' {
$date = Get-Date $Matches[0]
if($date -ge [datetime]::Today -and $date -le $referenceDate) {
$_
}
}
}
关于你的代码,它几乎是正确的,有3个问题:
- 正则表达式需要一些调整。
- 对
ParseExact
的调用未使用正确的日期格式。 - 您当前正在过滤超过 3 周的日期,而您想要的日期是小于或等于 3 周且大于或等于今天的日期。
$referenceDate = (Get-Date).AddDays(21)
Get-Content -Path 'Dates.ini' |
Where-Object { $_ -match '^(\d{1,2}/\d{1,2}/\d{4})' } |
Where-Object {
$date = [datetime]::ParseExact($Matches[1], 'M/d/yyyy', $null)
$date -ge [datetime]::Today -and $date -le $referenceDate
} | ForEach-Object { $_ }
关于arrays - PowerShell 数组过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75179390/