我有一个脚本(.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}
如果您运行此程序,它将仅对事件操作起作用。如果您停止并重新启动它,它将不会对文件夹中的任何现有文件起作用,直到触发另一个事件。
但是,要明白您的代码只查找新创建的文件。因此,如果您或用户将较旧的日期文件从一个位置复制到此文件夹,它将不会打开,只有最新创建的文件才会打开。复制当然不是创建操作。如果是这种情况,您必须更改事件处理以捕获创建或添加,然后更改我给出的内容以匹配该操作。