【问题标题】:Powershell Script TroubleshootingPowershell 脚本故障排除
【发布时间】:2016-12-21 21:01:13
【问题描述】:

我正在编写一个脚本,该脚本将检查文件夹并返回最后一个文件日期修改时间戳。然后它将比较当前系统时间并找出两者之间的差异,如果时间大于 20 分钟,则会发送电子邮件通知。

调试/运行时出现以下错误:

New-TimeSpan:找不到接受参数“$null”的位置参数。 在 C:\Users\jalden\Desktop\CalderaMonitoring-Part1.ps1:7 char:14 + $dtdiff = New-TimeSpan ($_.LastWriteTime) $(Get-Date) + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidArgument: (:) [New-TimeSpan], ParameterBindingException + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.NewTimeSpanCommand

这是我的脚本:

$src="c:\test\"
$sendmail=$false

Get-Item -path $src | Foreach {$_.LastWriteTime}
Foreach-Object 
{ 
    #write-host $_.fullname
    $dtdiff = New-TimeSpan ($_.LastWriteTime) $(Get-Date)

    if ($dtdiff.minutes -gt 20)
    {
        $strbody=$strbody +$_.fullname+ " - Created Time: "  +$_.LastWriteTime +"`r`n"
        $sendmail=$true
    }       
}

#$strbody

if($sendmail -eq $true)
{
    # Email components
    $strFromAddress = "abc@xyz.net"
    $strToAddress = "abc@xyz.net"
    $strMessageSubject = "Files not uploaded in the last 20 minutes"
    $strMessageBody = $strbody
    $strSendingServer = "smtp.gmail.com"
    $SMTPPort = "587"
    $emailSmtpUser = "abc@xyz.net"
    $emailSmtpPass = "testasfasdfa"

    # Email objects
    $objSMTPMessage = New-Object System.Net.Mail.MailMessage         $strFromAddress, $strToAddress, $strMessageSubject, $strMessageBody
    $objSMTPClient = New-Object System.Net.Mail.SMTPClient( $strSendingServer, $SMTPPort )
    $objSMTPClient.EnableSsl = $true
    $objSMTPClient.Credentials = New-Object System.Net.NetworkCredential( $emailSmtpUser , $emailSmtpPass );
    $objSMTPClient.Send($objSMTPMessage)
}

有什么建议吗?

【问题讨论】:

  • 虽然这不是您的错误问题,但请不要忘记 .Minutes. 可能为 0,其中 .TotalMinutes 会显示几天前的内容。
  • 我也不认为你需要Foreach {$_.LastWriteTime}。在我对我的盒子的基本测试中 - 以任何方式继续在流中都没有必要......不确定你在那里尝试做什么。

标签: powershell powershell-3.0


【解决方案1】:

下面的第二行,您没有向ForEach-Object 提供任何输入,因此$_$null

Get-Item -path $src | Foreach {$_.LastWriteTime}
  Foreach-Object { 
  #write-host $_.fullname
  $dtdiff = New-TimeSpan ($_.LastWriteTime) $(Get-Date)

  if ($dtdiff.minutes -gt 20){
    $strbody=$strbody +$_.fullname+ " - Created Time: "  +$_.LastWriteTime +"`r`n"
    $sendmail=$true
    }       
}

改成:

Get-Item -path $src | ForEach-Object { 
  #write-host $_.fullname
  $dtdiff = New-TimeSpan ($_.LastWriteTime) $(Get-Date)

  if ($dtdiff.TotalMinutes -gt 20){
    $strbody=$strbody +$_.fullname+ " - Created Time: "  +$_.LastWriteTime +"`r`n"
    $sendmail=$true
    }       
}

作为@gravity notes,如果if 语句,您应该使用$dtdiff.TotalMinutes 而不是$dtdiff.Minutes

【讨论】:

  • 最后一个问题。如果我只想返回最新文件的结果,我知道我需要使用 Get-ChildItem 但我将使用什么语法来返回最新文件?
猜你喜欢
  • 2013-04-05
  • 1970-01-01
  • 2014-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-15
相关资源
最近更新 更多