1 votos

Abrir un archivo automáticamente cuando se agrega un directorio, con PowerShell

Tengo un script (.ps1) que es el seguimiento de un directorio, y cuando se crea un archivo se debe abrir ese archivo concreto (en este caso un .pdf).

Hay varios archivos en el directorio, pero sólo debe abrir la que se detectó como se ha creado/trasladó a ese directorio cuando se ejecuta el script.

Un nuevo archivo será continuamente de modo que el nombre cambia un poco cada vez. Ejemplo1.pdf, Ejemplo2.pdf y así sucesivamente. Esto significa que tengo que abrir el archivo más reciente, independientemente del nombre.

Ahora es sólo la supervisión del directorio, porque no estoy seguro de cómo proceder con abrir el archivo cuando se detecta.

Me gustaría mantener todo en un solo script, si es posible.

(Yo no soy la que se experimentó con powershell. Howerver, tengo experiencia con el cmd/lote. Estoy tratando de convertir a powershell)

Cualquier buen métodos para realizar este trabajo?

Este es mi script:

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

0voto

postanote Puntos 159

Trate de hacer un cheque o ordenar usando el LastWriteTime para obtener la más actual del archivo a abrir.

Algo como

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

Actualización para el OP...

Mi punto de el fragmento de código que he publicado aquí no era la que estaba separado de su código. Usted se encarnan en su observador código, por lo que se activa sólo después de que el evento se dispara y la serialización se produce. Esto es algo que he hecho para los clientes durante varios años, y ha funcionado como se ha diseñado.

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

Si ejecuta esta, solo actuará en el evento de acción. Si se detiene este y se reinicia, no actuará en cualquier archivo existente en la carpeta hasta que otro evento de incendios.

Sin embargo, entiende que su código está sólo en busca de la creación de nuevos archivos. Por lo tanto, si usted o un usuario copia un viejo con fecha de archivo de una ubicación a esta carpeta, no se abre, sólo la última recién creado archivo. Una copia de curso no es una acción de crear. Si ese es el caso, usted tiene que cambiar su evento manejado para atrapar para crear o agregar, a continuación, cambiar lo que me dio para que coincida con.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: