【问题标题】:Powershell Get-ChildItemPowershell Get-ChildItem
【发布时间】:2016-12-27 13:47:07
【问题描述】:

我编写了一个 powershell 脚本来检查文件夹的内容,如果有一个 LastWriteTime 超过 20 分钟的文件来通知我。我遇到的问题是当我得到结果时,它包括电子邮件正文中的所有文件。我将如何编写它以仅获取电子邮件正文中的最新文件名?

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

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

if ($dtdiff.TotalMinutes -gt 20){
$strbody=$strbody +$_.fullname+ " Last File Modified at "  +$_.LastWriteTime +"`r`n"
$sendmail=$true
}       
}


#$strbody
 if($sendmail -eq $true){
# Email components
$strFromAddress = "abc@xyz.net"
$strToAddress = "abc@xyz.net"
$strMessageSubject = "REPORT"
$strMessageBody = $strbody
$strSendingServer = "smtp.com"
$SMTPPort = "587"
$emailSmtpUser = "abc@xyz.net"
$emailSmtpPass = "test123"
# 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)
}

【问题讨论】:

  • 最新文件名是什么意思?

标签: powershell


【解决方案1】:

仅获取最实际的文件:已编辑以消除缺陷

Get-ChildItem -path $src | 
  Sort LastWriteTime | 
    Select -last 1 |
      ForEach-Object { 
        #write-host $_.fullname
        $dtdiff = New-TimeSpan ($_.LastWriteTime) $(Get-Date)
        if ($dtdiff.TotalMinutes -gt 20){
          $strbody=$strbody +$_.fullname+ " Last File Modified at "  +$_.LastWriteTime +"`r`n"
          $sendmail=$true
        }       
}

【讨论】:

  • 看起来这只会对最旧的文件进行操作,而不是对 -20 天的最新文件进行操作。
  • @lit 感谢您的提示,我在一个只有两个文件的文件夹中使用 Sort $_.LastWriteTimeSort LastWriteTime 得到了不同的结果。我猜第一个被转换为字符串。
  • 我可能错误地阅读了 OP 的问题,但我认为他想要的是 -20 天的最新文件。目录中可能有多个文件更新时间超过 -20 天。看起来这段代码只会检查一个最近的文件是 -20 天。
  • foreach 中的代码是带有 TotalMinutes 的原始代码。管道仅将文件减少到一个 - 如果它不匹配,如果没有生成邮件。
  • ForEach-Object 循环将只接收一 (1) 个文件。该文件将是目录中的最新文件。它可能来自昨天或今天。该目录可能仍包含 > 20 天前的文件。
【解决方案2】:

您在该循环中将每个文件名及其关联的时间戳附加到$strbody。它正在执行您指定的操作。

如果您想要在过去 20 分钟内创建的最新文件,请将您的 get-childitem/foreach 循环更改为:

$mostrecentfile = get-childitem -path $src | 
    where-object {$_.lastwritetime -gt (get-date).addminutes(-20)} |
    sort-object -property lastwritetime -descending | select-object -first 1
}

if ($mostrecentfile -ne $null) {
$strbody=$_.fullname+ " Last File Modified at "  +$_.LastWriteTime;
$sendmail = $true;
}

【讨论】:

    【解决方案3】:
    get-childitem "c:\temp" -file | where LastWriteTime -le (Get-Date).AddMinutes(-20) |
        Sort lastwritetime -descending  | 
    % {
    
    $strFromAddress = "abc@xyz.net"
    $strToAddress = "abc@xyz.net"
    $strMessageSubject = "REPORT"
    $strMessageBody = "Last file modifed '{0}' at {1}" -f $_.fullname, $_.LastWriteTime
    $strSendingServer = "smtp.com"
    $SMTPPort = "587"
    $emailSmtpUser = "abc@xyz.net"
    $emailSmtpPass = "test123"
    # 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)
    $objSMTPClient.Dispose()
    break
    }
    

    【讨论】:

      猜你喜欢
      • 2011-02-22
      • 1970-01-01
      • 2019-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多