【发布时间】:2016-02-15 09:46:03
【问题描述】:
我目前正在尝试为某些文件夹中包含超过 50 个文件时设置警报。文件夹目录是这样的:
C:\Application\CustomerID\oneDirectory\RegisterName\transactions\FilesToCount
对于oneDirectory,有多个我不关心 - 我只关心oneDirectory。还有多个我关心的RegisterNames。对于transactions,还有多个我不关心的其他目录。对于CustomerID,我确实关心多个其他目录(客户)
基本上,我需要为每个客户的每个寄存器计算transactions 文件夹中的文件数,同时忽略所有其他文件夹。如果任何一个客户有超过 50 个左右的文件,我需要收到一封电子邮件告诉我。我还需要忽略.ini 文件。
现在,我有以下脚本可以正常工作并执行上面所需的功能,但运行时间太长,我不知道为什么:
$mainFolder = "C:\Application\Customer."
$tenantID = "CustomerID"
$maxTenantID = "HighestCustomerID"
$registerPath = "\oneDirectory\"
while($tenantID -le $maxTenantID) {
$loc = $mainFolder + $tenantID + $registerPath
$ignore = @("failed_transactions", "saved_transactions", "temp", "offline_logs", "pos_logs", "pos_reports")
$files = Get-ChildItem -Path $loc -Recurse -Exclude *.ini | ? { !$_.PSIsContainer } | % {
$relative = $_.FullName.Replace($loc, "")
$nomatch = $true
foreach ($folder in $ignore) {
if($relative -like "*\$folder\*") {
$nomatch = $false
}
}
if ($nomatch) { $_ }
}
$currentCount = $files.Count
if($currentCount -gt 50) {
Send-MailMessage -From "email@whatever.com" -To "email@whatever.com" -SmtpServer "smtp.whatever.com" -Subject "Transactions stuck" -Body "$loc has over 50 transactions."
}
$tenantID++
}
如前所述,上面的代码可以正确完成工作,但我正在尝试设置一个计划任务以每小时运行一次。在测试期间,这需要一个多小时才能完成。我什至把它分成三个脚本,每个脚本占客户列表的 1/3,但仍然需要很长时间。
我不确定它背后的逻辑是否存在问题,或者它是否不够有效。这是我的第一个 powershell 脚本,所以我不知道从哪里开始。
【问题讨论】:
-
嗨,最大的 oneDirectory 文件夹中有多少文件(大约)?
-
oneDirectory 列出每个客户的所有寄存器(目录)。所以我会说他们都有不到100个目录。奇怪的是,当我运行脚本时,有时即使“oneDirectory”中只有一个寄存器,它也会变得很慢
-
定时任务不好玩吗?我认为计划任务的最短休息时间是 1 小时。很抱歉让您感到困惑,但您对结果有何期待?您是否可以指定一组文件(例如 .txt 文件)?这似乎是一个报告脚本。您希望报告显示什么内容?
标签: powershell recursion count directory