将数组元素管道化为New-TimeSpan返回方法不受支持

时间:2017-07-13 04:07:20

标签: powershell powershell-v2.0

我有一个脚本可以检查某些文件的上次写入时间,如果它们超出了我希望它们所在的时间参数,它们会向我发送一个文本。以下是我曾经如何做的(工作)方式:

$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.如果它永远不会,那么我想要完成的最佳方式是什么?

1 个答案:

答案 0 :(得分:1)

您当前的问题是您使用$lastupdateForEach-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"实例,尽管此优化的实际影响可以忽略不计。