【问题标题】:Get name or path of folder if it's empty如果文件夹为空,则获取文件夹的名称或路径
【发布时间】:2018-08-21 13:15:37
【问题描述】:

我正在编写一个脚本,它检查每个子文件夹中是否有一个 txt 文件。这工作正常,但如果其中没有 txt 文件,如何获得子文件夹的名称?

例如:在“C:\Files\”中,我有一些子文件夹 A、B、C 和 D。在这些子文件夹中,只有一个 txt 文件,它是从另一个软件生成和放置的​​。这些文件每天都会被新的 txt 文件替换。

有时缺少一个或多个文件,因此子文件夹为空。如果文件夹不包含 txt 文件,如何获取文件夹名称?

我的代码:

检查昨天的文件是否存在

$yesterday = Get-ChildItem C:\Files\*.txt -Recurse | Where-Object {
    $_.LastWriteTime.ToShortDateString() -eq (Get-Date).AddDays(-1).ToShortDateString()
}

当文件丢失时:

if (!$yesterday) {
    Send-MailMessage 
        -To $mailReceiver 
        -Cc $mailReceiverCc 
        -From "$mailSenderName $mailSender" 
        -Subject "Backup error" 
        -Body "Backup from yesterday is missing!" 
        -SmtpServer $mailSmtpServer
}

【问题讨论】:

  • 那么如何检查是否有 .txt 文件?以你已经完成的工作为基础可能是最好的?
  • 我添加了我的代码@Paxz
  • 请注意,如果您想像这样包装Send-MailMessage 语句,您需要使用反引号来转义换行符(即在每个包裹行的末尾放置反引号)。

标签: powershell


【解决方案1】:

枚举目录并过滤那些不包含少于一天的 .txt 文件的目录。

$limit = (Get-Date).AddDays(-1)
Get-ChildItem -Recurse | Where-Object {
    $_.PSIsContainer -and
    -not (Get-ChildItem $_.FullName -Filter '*.txt' | Where-Object {
        $_.LastWriteTime -gt $limit
    })
} | Select-Object -Expand FullName

在 PowerShell v3 及更高版本上,您可以将其简化为

$limit = (Get-Date).AddDays(-1)
Get-ChildItem -Recurse -Directory | Where-Object {
    -not (Get-ChildItem $_.FullName -Filter '*.txt' | Where-Object {
        $_.LastWriteTime -gt $limit
    })
} | Select-Object -Expand FullName

【讨论】:

  • 您的解决方案实际上是有效的,但我在努力将它与我上面的代码结合起来。有没有一种方法可以增强您的代码,同时检查最后一个 txt 文件(当文件不丢失时)是否不超过一天?
  • @EmreBeloz 过滤文件列表,查找不到一天前修改的文件。查看更新的答案。
猜你喜欢
  • 1970-01-01
  • 2020-12-19
  • 2011-01-25
  • 2011-04-13
  • 2011-07-10
  • 2017-12-22
  • 1970-01-01
  • 2016-12-29
相关资源
最近更新 更多