我有一个脚本可以检查某些文件的上次写入时间,如果它们超出了我希望它们所在的时间参数,它们会向我发送一个文本。以下是我曾经如何做的(工作)方式:
$lastupdate = (Get-ChildItem N:\BYUI-played.xml).LastWriteTime
$currentdate = get-date
$difference =NEW-TIMESPAN –Start $lastupdate –End $currentdate
IF ($difference -gt "0.0:31:0.0") {
$Sesherror = 1
Log-Write "$currentdate [ERROR] BYUI-JustPlayed is down"
}
六次......然后程序底部的if会检查$Sesherror
的值,并且......你可以找出其余部分。显然很麻烦而且编写得不是很好。所以,我决定重构它,我想出了我认为很光滑的东西:
$lastupdate = @((Get-ChildItem N:\BYUI-played.xml).LastWriteTime,(Get-ChildItem N:\byui-now.xml).LastWriteTime,(Get-ChildItem N:\KBYR-played.xml).LastWriteTime,(Get-ChildItem N:\KBYR-now.xml).LastWriteTime,(Get-ChildItem N:\KBYI-played.xml).LastWriteTime,(Get-ChildItem N:\KBYI-now.xml).LastWriteTime)
Try {
$lastupdate | % {
if (NEW-TIMESPAN –Start $lastupdate –End $currentdate -gt "0.1:0:0.0") {
$Sesherror = 1
Log-Write "$currentdate [ERROR] $lastupdate is down"
}}
}
Catch {
Write-Warning "Something went wrong with the algorithim"
Write-Host "$ERROR" -foregroundcolor Red
Write-Warning "Terminating error. Shutting down."
cmd /c pause
exit
}
再次,轮询底部的$Sesherror
变量。但是,当它运行时,我得到六个此错误消息的实例:
Cannot convert 'System.Object[]' to the type 'System.DateTime' required by parameter 'Start'. Specified method is not supported.
所以我必须假设它与数组被管道输入作为一个" Time"类型。但是,我已经回应了数组,他们都输出了正确的时间类型。所以我想这个问题有两个方面:
1.为什么foreach循环不接受数组?
2.如果它永远不会,那么我想要完成的最佳方式是什么?
答案 0 :(得分:1)
您当前的问题是您使用$lastupdate
(ForEach-Object
)脚本块中的数组值%
变量而不是自动迭代变量{{1} }。
因此,您将数组传递给$_
的{{1}}参数,该参数失败。
此外,可以对您的脚本进行一些优化:
New-TimeSpan
-Start
/ $files = 'N:\BYUI-played.xml', 'N:\byui-now.xml', 'N:\KBYR-played.xml', 'N:\KBYR-now.xml', 'N:\KBYI-played.xml', 'N:\KBYI-now.xml'
$lastupdate = @(Get-Item $files | % { $_.LastWriteTime })
$currentdate = get-date
Try {
$lastupdate | % {
if (($_ – $currentdate) -gt "0.1:0:0.0") {
$Sesherror = 1
Log-Write "$currentdate [ERROR] $lastupdate is down"
}
}
} Catch {
Write-Warning "Something went wrong with the algorithm"
Write-Host "$ERROR" -foregroundcolor Red
Write-Warning "Terminating error. Shutting down."
cmd /c pause
exit
}
接受路径的数组,因此不需要为每个文件单独调用。
从彼此中减去两个Get-ChildItem
个实例会隐式返回Get-Item
个实例 - 不需要[datetime]
。
此外,您可以在循环外部基于[timespan]
构建New-TimeSpan
实例并将其存储在变量中以用于[timespan]
比较,以避免在每次循环迭代中将字符串值转换为"0.1:0:0.0"
实例,尽管此优化的实际影响可以忽略不计。