1

У меня есть скрипт (.ps1), который отслеживает каталог, и когда файл создается, он должен открыть этот конкретный файл (в данном случае .pdf).

В каталоге несколько файлов, но он должен открывать только тот, который обнаружен, когда он создается / перемещается в этот каталог во время выполнения скрипта.

Новый файл будет добавляться постоянно, поэтому имя меняется каждый раз. Example1.pdf, Example2.pdf и так далее. Это означает, что мне нужно открыть самый последний файл, независимо от имени.

Прямо сейчас это только мониторинг каталога, потому что я не уверен, как продолжить открывать файл, когда он обнаружен.

Я хотел бы сохранить все в этом единственном сценарии, если это возможно.

(Я не настолько опытен с PowerShell. Howerver, у меня есть опыт работы с cmd/batch. Я пытаюсь перевести на powershell)

Какие-нибудь хорошие методы, чтобы заставить это работать?

Это мой сценарий:

    $host.UI.RawUI.WindowTitle = "Watcher"
    $watcher = New-Object System.IO.FileSystemWatcher 
    $watcher.Path = "C:\top_secret_path\test"
    $watcher.Filter = "*.*"
    $watcher.IncludeSubdirectories = $false
    $watcher.EnableRaisingEvents = $false  

    $action = { 
        $path = $Event.SourceEventArgs.FullPath 
                $changeType = $Event.SourceEventArgs.ChangeType
                $logline = "$(Get-Date), $changeType, $path"
                Add-content "C:\top_secret_path\log.txt" -value $logline 
              }

    Register-ObjectEvent $watcher "Created" -Action $action | Format-Table -AutoSize 
    while ($true) {sleep 5}

1 ответ1

0

Попробуйте выполнить проверку или сортировку, используя LastWriteTime, чтобы получить самый последний файл для открытия.

Что-то вроде

$FilePath = 'D:\temp'
$LatestFileName = Get-ChildItem -Path $FilePath -File | 
Sort-Object LastWriteTime -Descending | Select-Object -First 1
Start-Process -FilePath $LatestFileName.FullName

Обновление для ОП ...

Моя точка зрения на фрагмент, который я разместил здесь, была не в том, что он был отдельным от вашего кода. Вы включаете его в свой код наблюдателя, поэтому он запускается только после того, как событие инициируется и происходит сериализация. Это то, что я делал для клиентов в течение нескольких лет, и оно работало так, как задумано.

$host.UI.RawUI.WindowTitle = "Watcher"
$watcher = New-Object System.IO.FileSystemWatcher 
$watcher.Path = "D:\top_secret_path\test"
$watcher.Filter = "*.*"
$watcher.IncludeSubdirectories = $false
$watcher.EnableRaisingEvents = $false  

$action = { 
    $path = $Event.SourceEventArgs.FullPath 
            $changeType = $Event.SourceEventArgs.ChangeType
            $logline = "$(Get-Date), $changeType, $path"
            Add-content "D:\top_secret_path\log.txt" -value $logline 

            # File action
            $FilePath = $watcher.Path
            $LatestFileName = Get-ChildItem -Path $FilePath -File | 
            Sort-Object LastWriteTime -Descending | Select-Object -First 1
            Start-Process -FilePath $LatestFileName.FullName
          }

Register-ObjectEvent $watcher "Created" -Action $action | Format-Table -AutoSize 
while ($true) {sleep 5}

Если вы запустите это, он будет действовать только на действие события. Если вы остановите это и перезапустите, он не будет действовать ни на один из существующих файлов в папке, пока не сработает другое событие.

Тем не менее, следует понимать, что ваш код ищет только новые созданные файлы. Таким образом, если вы или пользователь скопируете старый файл с датой из одного места в эту папку, он не откроется, а будет только последний созданный файл. Копия, конечно, не является действием создания. Если это так, вы должны изменить свое событие, обработанное, чтобы перехватить создание или добавление, затем измените то, что я дал, чтобы соответствовать этому.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .