Если оператор в FileSystemWatcher не работает в Powershell - PullRequest
0 голосов
/ 06 февраля 2020

Я пытаюсь реализовать FileSystemWatcher, который содержит оператор if, который оценивает и передает аргумент, но, похоже, он не оценивает. Я делаю ошибку? Вот код:

Function Auto-Watcher
{
    param ($folder, $filter, $Program)

    $watcher = New-Object IO.FileSystemWatcher $folder, $filter -Property @{
        IncludeSubdirectories = $true
        EnableRaisingEvents = $true
    }

    Write-Host "Watching $folder for creation or moving of $filter files..."

    $changeAction = {
        $path = $Event.SourceEventArgs.FullPath
        $name = $Event.SourceEventArgs.Name
        $changeType = $Event.SourceEventArgs.ChangeType
        $timeStamp = $Event.TimeGenerated

        if ($Program -match "Report1") {
            Write-Host $Path "Ready for Report1 Generation"
            else {
                if ($Program -match "Report2") {
                    Write-Host Split-Path $Path "Ready for Report2 Generation"
                    else {
                        write-output "Error, not capable of matching identical strings"
                    }
                }
            }
        }

        Write-Host "The file $name was $changeType at $timeStamp"
    }
    Register-ObjectEvent $Watcher -EventName "Created" -Action $changeAction
}

Я добавил в оператор Write-Output перед оператором if, который подтвердил, что $Program -match "Report1" возвращал $true, но, похоже, ничего в операторах if оцениваться. Что я могу сделать?

1 Ответ

3 голосов
/ 06 февраля 2020

Ваша структура if / else неверна внутри $changeAction. Оба else блока находятся внутри , что и должно быть их связанным if блоком. То есть у вас есть это ...

if ($condition) {
    else {
    }
}

... когда это должно быть так ...

if ($condition) {
    # $true branch
} else {
    # $false branch
}

Попробуйте определить структуру if в $changeAction как это ...

if ($Program -match "Report1") {
    Write-Host $Path "Ready for Report1 Generation"
} elseif ($Program -match "Report2") {
    Write-Host (Split-Path $Path) "Ready for Report2 Generation"
} else {
    Write-Output "Error, not capable of matching identical strings"
}

... и посмотреть, работает ли это. Обратите внимание, что я добавил () вокруг вызова к Split-Path $Path, чтобы он оценивался и результат передавался в Write-Host.

. Вы также можете переписать вышеприведенное, используя оператор switch ...

switch -Regex ($Program) {
    "Report1" {
        Write-Host $Path "Ready for Report1 Generation"
        break
    }
    "Report2" {
        Write-Host (Split-Path $Path) "Ready for Report2 Generation"
        break
    }
    Default {
        Write-Output "Error, not capable of matching identical strings"
        break
    }
}

Я добавил параметр -Regex, чтобы сделать его эквивалентным использованию оператора -match в условиях if. Обратите внимание, что если вы намеревались выполнить точное сравнение строк в операторах if, вы можете использовать, например, if ($Program -eq "Report1") {, чтобы выполнить сравнение без учета регистра. Если вы намеревались выполнить сравнение подстрок, вы можете использовать if ($Program -like "*Report1*") { вместо оператора -match.

...