Mit PowerShell können Sie eine Datei automatisch öffnen, wenn sie einem Verzeichnis hinzugefügt wird

727
Tom

Ich habe ein Skript ( .ps1), das ein Verzeichnis überwacht, und wenn eine Datei erstellt wird, sollte diese bestimmte Datei ( in diesem Fall a.pdf ) geöffnet werden .

Es gibt mehrere Dateien in dem Verzeichnis, aber es sollte nur die geöffnet werden, die erkannt wird, wenn sie erstellt oder in dieses Verzeichnis verschoben wird, wenn das Skript ausgeführt wird.

Eine neue Datei wird kontinuierlich hinzugefügt, so dass sich der Name jedes Mal leicht ändert. Beispiel1.pdf, Beispiel2.pdf und so weiter. Dies bedeutet, dass ich die neueste Datei unabhängig vom Namen öffnen muss.

Im Moment wird nur das Verzeichnis überwacht, da ich nicht sicher bin, wie ich die Datei öffnen soll, wenn sie entdeckt wird.

Ich möchte, wenn möglich, alles in diesem einzigen Skript behalten.

(Ich habe keine Erfahrung mit Powershell. Howerver, ich habe Erfahrung mit cmd / batch. Ich versuche, in Powershell umzuwandeln.)

Gibt es gute Methoden, um dies zu erreichen?

Das ist mein Skript:

 $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
Rufen Sie einfach die Datei auf und sie sollte mit der Standardanwendung für sie geöffnet werden. Seth vor 5 Jahren 0
Wenn Sie während eines Ereignisses schlafen, verlieren Sie Ereignisse. harrymc vor 5 Jahren 0
Ich kann keine bestimmte Datei aufrufen, da der Dateiname nicht jedes Mal gleich ist. Beispiel.pdf, Beispiel1.pdf, Beispiel2.pdf und so weiter. Tom vor 5 Jahren 0

1 Antwort auf die Frage

0
postanote

Versuchen Sie eine Überprüfung oder Sortierung mithilfe von LastWriteTime, um die aktuellste Datei zum Öffnen zu erhalten.

So etwas wie

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

Update für das OP ...

Der Punkt, den ich hier gepostet habe, war nicht der Unterschied zu Ihrem Code. Sie verkörpern es in Ihrem Watcher-Code, so dass es nur ausgelöst wird, nachdem das Ereignis ausgelöst wurde und die Serialisierung erfolgt. Dies ist etwas, was ich seit einigen Jahren für Kunden getan habe und es hat wie geplant funktioniert.

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

Wenn Sie dies ausführen, wirkt sich dies nur auf die Ereignisaktion aus. Wenn Sie dies beenden und neu starten, wirkt sich dies nicht auf vorhandene Dateien im Ordner aus, bis ein anderes Ereignis ausgelöst wird.

Verstehen Sie jedoch, dass Ihr Code nur nach neu erstellten Dateien sucht. Wenn Sie oder ein Benutzer eine ältere datierte Datei von einem Ort in diesen Ordner kopieren, wird diese nicht geöffnet, sondern nur die zuletzt neu erstellte Datei. Eine Kopie ist natürlich keine Erstellungsaktion. Wenn dies der Fall ist, müssen Sie Ihre behandelten Ereignisse so ändern, dass sie zum Erstellen oder Hinzufügen abgefangen werden, und dann das, was ich gegeben habe, um dies zu tun.

Ok, das könnte funktionieren, aber ich brauche das, was Sie zur Verfügung gestellt haben, um zu geschehen, wenn das Skript feststellt, dass dem Ordner eine neue Datei hinzugefügt wird. Ich möchte nicht, dass beim Öffnen des Skripts die neueste Datei geöffnet wird. Ich möchte, dass eine Datei geöffnet wird, wenn sie nach dem Start des Skripts hinzugefügt wird. Tom vor 5 Jahren 0
Ah ok, ich verstehe. Ich habe es ausprobiert und es heißt: "Nicht gestartet". Was würde das bewirken? Tom vor 5 Jahren 0