我正在通过 API 使用 powershell 搜索 Splunk 并获取包含日期的数据列表(不是日期时间格式)。
API 调用由一个运行良好的函数执行,它适用于需要搜索以及开始和结束日期/时间的初始搜索。
初始搜索完成后,我将循环结果并执行子搜索(在 Splunk 中)从不同的索引中查找其他数据。
我将返回的日期和时间(例如 16/02/2024 12:45:27)在空格上分开,只返回日期部分,然后创建两个字段:
$EmailSearchStartdt = "$(($DateConversion).split(" ")[0]) 00:00:00"
$EmailSearchEnddt = "$(($DateConversion).split(" ")[0]) 23:59:59"
这两个日期字段都失败了。我从初始搜索中获取日期并将它们转回日期时间,如下所示:
$EmailSearchStartdt = ([datetime]::ParseExact($EmailSearchStartdt,"dd/MM/yyyy HH:mm:ss", [System.Globalization.CultureInfo]::GetCultureInfo("en-GB")))
$EmailSearchEnddt = ([datetime]::ParseExact($EmailSearchEnddt,"dd/MM/yyyy HH:mm:ss", [System.Globalization.CultureInfo]::GetCultureInfo("en-GB")))
问题是 Powershell 正在将日期和月份反转为美国格式(我在英国,具有英国时区设置等,当反馈到函数中时,我得到以下信息:
EmailSearchStartdt:15/03/2024 00:00:00(这是字符串) EmailSearchStartdt:03/15/2024 00:00:00(这是在 parseexact 之后) EmailSearchEnddt:15/03/2024 23:59:59(这是字符串) EmailSearchEnddt:03/15/2024 23:59:59(这是在 parseexact 之后)
结果是 Splunk 什么也没发现,因为日期已颠倒。
如果我执行以下操作:
$EmailSearchStartdt = get-date -date $EmailSearchStartdt -Format "dd MMM yyyy HH:mm:ss"
$EmailSearchEnddt = get-date -date $EmailSearchEnddt -Format "dd MMM yyyy HH:mm:ss"
Splunk 似乎接受这一点,但如果我尝试:
$EmailSearchStartdt = (get-date -date $EmailSearchStartdt -Format "dd MMM yyyy HH:mm:ss").adddays(-3)
$EmailSearchEnddt = (get-date -date $EmailSearchEnddt -Format "dd MMM yyyy HH:mm:ss").adddays(1)
我得到:
Method invocation failed because [System.String] does not contain a method named 'adddays'.
所以 Powershell 将其视为字符串。
最终,脚本被调用为两个字符串日期,但该函数在使用子搜索内部调用时会拒绝此操作。
这真的让我彻底疯了,所以任何帮助将不胜感激!
核心问题是 PowerShell 中的 可扩展(插值)、双引号字符串 (
"..."
) 使用 不变文化来对非字符串值进行字符串化 - 无论当前影响哪种文化(如由 Get-Culture
报告),不变区域性基于(但不同于)具有 month-第一个日期格式的
en-US
区域性。
例如,诸如
"$(Get-Date 1970-12-01)"
always 之类的可扩展字符串会产生 12/01/1970 00:00:00
,即它首先报告月份。
相比之下,
.ToString()
方法使用当前文化,因此(Get-Date 1970-12-01).ToString()
的输出因文化而异,并在01/12/1970 00:00:00
文化中产生
en-GB
(第一天)。因此,
最好基于[datetime]
# Parse the input timestamp based on the given culture into
# [datetime] instances.
$culture = [cultureinfo] 'en-GB'
$format = 'dd/MM/yyyy HH:mm:ss'
$EmailSearchStartdt = [datetime]::ParseExact($EmailSearchStartdt, $format, $culture)
$EmailSearchEnddt = [datetime]::ParseExact($EmailSearchEnddt, $format, $culture)
# Modify these timestamps to refer to the start and end of each
# date's calendar day.
$EmailSearchStartdt = $EmailSearchStartdt.Date
$EmailSearchEnddt = $EmailSearchStartdt.Date.AddDays(1).AddSeconds(-1)
# Now stringify them as needed.
$outFormat = 'dd MMM yyyy HH:mm:ss'
$EmailSearchStartdt.ToString($outFormat, $culture)
$EmailSearchEnddt.ToString($outFormat, $culture)