使用 PowerShell 将文件添加到目录时自动打开它

使用 PowerShell 将文件添加到目录时自动打开它

我有一个脚本(.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) {sleep 5}

答案1

尝试使用 LastWriteTime 进行检查或排序以获取最新的要打开的文件。

就像是

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

向 OP 更新...

我在此处发布的代码片段的重点不是它与您的代码是分开的。您将其体现在您的观察者代码中,因此它仅在事件触发并发生序列化后才会触发。这是我为客户做了几年的事情,它已经按设计工作了。

$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}

如果您运行此程序,它将仅对事件操作起作用。如果您停止并重新启动它,它将不会对文件夹中的任何现有文件起作用,直到触发另一个事件。

但是,要明白您的代码只查找新创建的文件。因此,如果您或用户将较旧的日期文件从一个位置复制到此文件夹,它将不会打开,只有最新创建的文件才会打开。复制当然不是创建操作。如果是这种情况,您必须更改事件处理以捕获创建或添加,然后更改我给出的内容以匹配该操作。

相关内容