Без электронной почты и уборки при добавлении remove-item - PullRequest
0 голосов
/ 09 июля 2020

Сценарий связан с тем, что если не удается найти путь, отправляется электронное письмо и выводится в FileA. Если удалось найти путь, удалить любой журнал старше 30 дней и вывести его в FileA. Если добавить Get-ChildItem в эту строку, приведенный ниже скрипт не будет выполнять какие-либо операции + вывод в текстовый файл и отправлять электронное письмо пользователю. Если я аннулирую эту строку Get-ChildItem, пользователю будет отправлено электронное письмо.

Что я хочу:

  1. Отправить электронное письмо, если не удается найти путь и вывод в FileA. Если удается найти путь, ведите журнал регистрации старше 30 дней и выводите его в FileA
  2. Отправьте электронное письмо, если не можете найти путь, и выведите его в FileB. Если удается найти путь, вести журнал учета старше 30 дней и выводить его в FileB

#### Объявить путь к файлу housekeep $ housekeepLog = "D: \ logs-Copy *" << действительный path $ housekeepLog2 = "D: \ logs-Copy2 *" << недопустимый путь, специально для проверки отправки электронной почты </p>

####Housekeep any log older than 30days
>when add 2 sentence below, cannot send out email and no output to text file. when remove this, will send email and output to text file.
Get-ChildItem –Path $housekeepLog -Recurse | Where-Object {($_.LastWriteTime -lt (Get-Date).AddDays(-30))} | Remove-Item 
Get-ChildItem –Path $housekeepLog2 -Recurse | Where-Object {($_.LastWriteTime -lt (Get-Date).AddDays(-30))} | Remove-Item


####Output file
$outputHousekeep = "D:\Housekeep.txt"
$outputHousekeep2 = "D:\Housekeep2.txt"

$timestampDateTime = (Get-Date).ToString('yyyy-MM-dd HH:mm:ss')


#### housekeepLog
$EmailSplatHousekeep = @{
To =  "myemail@mydomain.com"
CC =  "myemail@mydomain.com"
SmtpServer = "smptserver@mydomain.com" 
From = "noreply@mydomain.com"
Priority = "High"
BodyAsHtml = $true
Subject = "Folder of Log File Does't Exist"
}

if (!(Test-Path $housekeepLog))
{
    $EmailSplatHousekeep.body = 
    "
    1. do something
    "
    
    Send-MailMessage @EmailSplatHousekeep
    Write-Output "$timestampDateTime The folder $housekeepLog doesn't exist! Check the folder path!" | Out-file $outputHousekeep  -Append
}
else
{
    ####Input to outputfile
    Write-Output "$timestampDateTime Done housekeeping in $housekeepLog ." | Out-file $outputHousekeep  -Append
}

#### housekeepLog2
$EmailSplatHousekeep2 = @{
To =  "myemail@mydomain.com"
CC =  "myemail@mydomain.com"
SmtpServer = "smptserver@mydomain.com" 
From = "noreply@mydomain.com"
Priority = "High"
BodyAsHtml = $true
Subject = "Folder of Log File Does't Exist"
}

if (!(Test-Path $housekeepLog2))
{
    $EmailSplatHousekeep2.body = 
    "
    1. do something
    "
    
    Send-MailMessage @EmailSplatHousekeep2
    Write-Output "$timestampDateTime The folder $housekeepLog2 doesn't exist! Check the folder path!" | Out-file $outputHousekeep2  -Append
}
else
{
    ####Input to outputfile
    Write-Output "$timestampDateTime Done housekeeping in $housekeepLog2 ." | Out-file $outputHousekeep2  -Append
}

1 Ответ

0 голосов
/ 09 июля 2020

Если я правильно понимаю вопрос, вы можете объединить это, используя массив housekeepingLog путей и l oop над ними, что сэкономит вам много повторяющегося кода.

Основная проблема с ваш код заключается в том, что вы сразу же удаляете старые журналы, и поэтому после этого невозможно определить, что вы удалили ..

Примерно так:

# Declare file path to be housekeep 
# first path in array is valid, second path is not
$housekeepLog = "D:\logs-Copy", "D:\logs-Copy2"
$timestamp    = (Get-Date).ToString('yyyy-MM-dd HH:mm:ss')

foreach ($path in $housekeepLog) {
    if (Test-Path $path -PathType Container) {
        # the path exists, get logfiles older than 30 days
        $refDate = (Get-Date).AddDays(-30).Date  # set time to 00:00:00 (aka midnight)
        # assuming the log files have the '.txt' extension.. If different, then change that in the Filter
        $oldLogs = Get-ChildItem –Path $path -Filter '*.txt' -File -Recurse |    
                   Where-Object {$_.LastWriteTime -lt $refDate}
        if ($oldLogs) {
            # save the full path and names of the old logfiles that are being deleted
            $currentFolder = Split-Path -Path $path -Leaf
            $outputFile    = "D:\Housekeep-$currentFolder.txt"
            Add-Content -Path $outputFile -Value $oldLogs.FullName
            Add-Content -Path $outputFile -Value "$timestamp - Done housekeeping in $path.`r`n"

            # remove the old log files
            $oldLogs | Remove-Item -Confirm:$false
        }
        else {
            Write-Host "No log files older than 30 days found in $path"
        }
    }
    else {
        Write-Warning "The folder '$path' does not exist.`r`nCheck the folder path!"
        # the path is not found, send email
        $emailProperties = @{
            To         = "myemail@mydomain.com"
            CC         = "myemail@mydomain.com"
            Subject    = "Folder '$path' does not exist"
            SmtpServer = "smptserver@mydomain.com"
            From       = "noreply@mydomain.com"
            Priority   = "High"
            Body       = "The folder $path does not exist.<br>Check the folder path!"
            BodyAsHtml = $true
        }
        Send-MailMessage @emailProperties
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...