Автоматически открывать файл при его добавлении в каталог с помощью PowerShell

324
Tom

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

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

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

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

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

(У меня нет такого опыта работы с PowerShell. Однако, у меня есть опыт работы с 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)  
1
Просто вызовите файл, и он должен быть открыт с приложением по умолчанию для него. Seth 5 лет назад 0
Если вы спите во время события, вы потеряете события. harrymc 5 лет назад 0
Я не могу вызвать конкретный файл, потому что имя файла не всегда будет одинаковым. Example.pdf, Example1.pdf, Example2.pdf и так далее. Tom 5 лет назад 0

1 ответ на вопрос

0
postanote

Попробуйте выполнить проверку или сортировку, используя 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)  

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

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

Хорошо, это может сработать, но мне нужно, чтобы вы предоставили это, когда сценарий узнает, что в папку добавлен новый файл. Я не хочу, чтобы он открывал самый последний файл при запуске скрипта. Я хочу, чтобы он открыл файл, если он будет добавлен после запуска скрипта. Tom 5 лет назад 0
Ах, хорошо, я вижу. Я попробовал это, и это говорит, что государство: Notstarted. Что вызвало бы это? Tom 5 лет назад 0