Powershell 和日期函数的问题
Issue with Powershell and date functions
我有一个脚本可以从我们的 SQL 服务器资产中提取信息。脚本会提取一些日期(最后检查 DBCC)并进行一些老化计算。
代码中有问题的部分在这里:
$lastDBCC_CHECKDB=$database.ExecuteWithResults("DBCC DBINFO () WITH TABLERESULTS").Tables[0] | Where-Object {$_.Field -eq "dbi_dbccLastKnownGood"} | Select-object Value
$lastDBCC_CHECKDB=$lastDBCC_CHECKDB.value -f (get-date)
$lastDBCC_CHECKDB=$lastDBCC_CHECKDB.Substring(0,19) | get-date -format 'dd/MM/yyyy HH:mm:ss'
Add-Member -InputObject $dbinfo -MemberType NoteProperty -Name 'Last CheckDBCC' -Value $lastDBCC_CHECKDB
$DBCCProblem = "None"
if ($lastDBCC_CHECKDB -lt $date.AddDays(-7)) { $DBCCProblem = "No CheckDBCC in the last week" }
if ($lastDBCC_CHECKDB -eq "01/01/1900 00:01:00") { $DBCCProblem = "CheckDBCC has never run" }
Add-Member -InputObject $dbinfo -MemberType NoteProperty -Name 'DBCC Issues' -Value $DBCCProblem
我的日期计算正常,但是,该过程似乎是根据当前 $date
的不同格式计算的。
无论我尝试什么,我似乎都无法在 AddDays
函数失败的情况下将 $date
强制为正确的格式。
在我的 Powershell 终端上,如果 运行 $date
(在 get-date
cmdlet 的脚本中设置),我得到:
09 July 2015 15:42:26
但是,如果我 运行:
$date=get-date
我得到的格式不正确:
09/07/2015 15:42:26
注意日期和月份(美国格式)。尽管我指定了日期格式 "dd/MM/yyyy HH:MM:ss".
,但我仍在根据该日期进行计算
同样,如果我在脚本中将 $date
设置为:
$date=Get-date
我的 AddDays
计算函数失败:
Method invocation failed because [System.String] does not contain a method named 'AddDays'.
At ...\SQLServerBackupSummary.ps1:122 char:21
+ if ($lastDBCC_CHECKDB -lt $now.AddDays(-7)) ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound
指定添加日期时间不起作用:
$lastDBCC_CHECKDB.Datetime -lt $date.AddDays(-7))
这似乎把一切都搞砸了。
感谢任何对此的指点,我对 Powershell 仍然很陌生,但以前从未在其他脚本语言中遇到过日期转换问题。
我认为这与日期格式无关。基于行:
if ($lastDBCC_CHECKDB -eq "01/01/1900 00:01:00")
我猜 $lastDBCC_CHECKDB 是一个字符串,因此您正在比较 2 个字符串。您想比较 2 个日期:所以要么尝试
if ([DateTime]$lastDBCC_CHECKDB -lt $date.AddDays(-7))
如果您需要解析自定义日期格式或更多信息,请关注 this link。
我有一个脚本可以从我们的 SQL 服务器资产中提取信息。脚本会提取一些日期(最后检查 DBCC)并进行一些老化计算。
代码中有问题的部分在这里:
$lastDBCC_CHECKDB=$database.ExecuteWithResults("DBCC DBINFO () WITH TABLERESULTS").Tables[0] | Where-Object {$_.Field -eq "dbi_dbccLastKnownGood"} | Select-object Value
$lastDBCC_CHECKDB=$lastDBCC_CHECKDB.value -f (get-date)
$lastDBCC_CHECKDB=$lastDBCC_CHECKDB.Substring(0,19) | get-date -format 'dd/MM/yyyy HH:mm:ss'
Add-Member -InputObject $dbinfo -MemberType NoteProperty -Name 'Last CheckDBCC' -Value $lastDBCC_CHECKDB
$DBCCProblem = "None"
if ($lastDBCC_CHECKDB -lt $date.AddDays(-7)) { $DBCCProblem = "No CheckDBCC in the last week" }
if ($lastDBCC_CHECKDB -eq "01/01/1900 00:01:00") { $DBCCProblem = "CheckDBCC has never run" }
Add-Member -InputObject $dbinfo -MemberType NoteProperty -Name 'DBCC Issues' -Value $DBCCProblem
我的日期计算正常,但是,该过程似乎是根据当前 $date
的不同格式计算的。
无论我尝试什么,我似乎都无法在 AddDays
函数失败的情况下将 $date
强制为正确的格式。
在我的 Powershell 终端上,如果 运行 $date
(在 get-date
cmdlet 的脚本中设置),我得到:
09 July 2015 15:42:26
但是,如果我 运行:
$date=get-date
我得到的格式不正确:
09/07/2015 15:42:26
注意日期和月份(美国格式)。尽管我指定了日期格式 "dd/MM/yyyy HH:MM:ss".
,但我仍在根据该日期进行计算同样,如果我在脚本中将 $date
设置为:
$date=Get-date
我的 AddDays
计算函数失败:
Method invocation failed because [System.String] does not contain a method named 'AddDays'.
At ...\SQLServerBackupSummary.ps1:122 char:21
+ if ($lastDBCC_CHECKDB -lt $now.AddDays(-7)) ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : MethodNotFound
指定添加日期时间不起作用:
$lastDBCC_CHECKDB.Datetime -lt $date.AddDays(-7))
这似乎把一切都搞砸了。
感谢任何对此的指点,我对 Powershell 仍然很陌生,但以前从未在其他脚本语言中遇到过日期转换问题。
我认为这与日期格式无关。基于行:
if ($lastDBCC_CHECKDB -eq "01/01/1900 00:01:00")
我猜 $lastDBCC_CHECKDB 是一个字符串,因此您正在比较 2 个字符串。您想比较 2 个日期:所以要么尝试
if ([DateTime]$lastDBCC_CHECKDB -lt $date.AddDays(-7))
如果您需要解析自定义日期格式或更多信息,请关注 this link。