Как выполнить блокнот один раз, когда файл перемещается с помощью powershell - PullRequest
0 голосов
/ 27 июня 2018

Привет, я новичок в powershell

В настоящее время я пытаюсь написать скрипт на powershell.

  1. Отслеживание изменений в определенной папке (C: \ Users \ CELINE \ Desktop \ Testing4)

  2. Если обнаружен новый файл, он автоматически переместит файл в другую папку (C: \ Users \ CELINE \ Desktop \ PowerShellChanges2)

  3. Автоматически переименовывать перемещенный файл в «Request.csv»

  4. Добавлять добавочные номера к именам файлов при перемещении новых файлов в папку (например, Request (1) .csv, Request (2) .csv, Request (3) .csv и т. Д.)

  5. Открыть блокнот после перемещения файла

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

Кто-нибудь может помочь?

Вот мои коды

$watcher = New-Object System.IO.FileSystemWatcher

#Path of folder to watch

$watcher.Path = "C:\Users\CELINE\Desktop\Testing4"
$watcher.Filter = "*.*"
$watcher.IncludeSubdirectories = $true
$watcher.EnableRaisingEvents = $true 

#Action executed when changes detected

$action = { 


#SourcePath
$path = $Event.SourceEventArgs.FullPath

$changeType = $Event.SourceEventArgs.ChangeType
$logline = "$(Get-Date), $changeType, $path"

#Destination path
$dest = "C:\Users\CELINE\Desktop\PowerShellChanges2\Request.csv"

#Add Log file to monitor the changes 

Add-content "C:\Users\CELINE\Desktop\logtest5.txt" -value $logline

#Move Files

$actionMove = Move-Item -Path $path -Destination $dest

#Append number to filename

If (Test-Path $dest) {
    $i = 0
    While (Test-Path $dest) {
        $i += 1
        $renamefile "C:\Users\CELINE\Desktop\PowerShellChanges2\Request($i).csv"
        Rename-Item -Path $dest -NewName $renamefile
    }
}





#Execute Notepad


$FileExists = Test-Path $dest
If ($FileExists -eq $True) {C:\Windows\notepad.exe}
} 

#Event Trigger
Register-ObjectEvent $watcher "Changed" -Action $action
while ($true) {Sleep 0}

1 Ответ

0 голосов
/ 27 июня 2018

Вы можете проверить, работает ли Блокнот, а затем запустить новый экземпляр, если это не так. Например, измените эту часть вашего скрипта:

$FileExists = Test-Path $dest
If ($FileExists -eq $True) {C:\Windows\notepad.exe}
} 

На что-то вроде:

if ((Test-Path $dest) -and ((Get-Process | Where Id -eq $procId) -eq $null))
{
    $procId = (Start-Process -FilePath "C:\Windows\notepad.exe" -PassThru).Id
}

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

У меня были некоторые проблемы с вашим кодом, которые не давали ему работать, даже без этого изменения, поэтому я немного подправил его. Код ниже должен работать правильно:

$watcher = New-Object System.IO.FileSystemWatcher

# Path of folder to watch
$watcher.Path = "C:\Users\CELINE\Desktop\Testing4"
$watcher.Filter = "*.*"
$watcher.IncludeSubdirectories = $true
$watcher.EnableRaisingEvents = $true 

$procId = -1
$i = 1

# Action executed when changes detected
$action = 
{ 
    # SourcePath
    $path = $Event.SourceEventArgs.FullPath

    #Destination path
    $targetFile = "C:\Users\CELINE\Desktop\PowerShellChanges2\Request.csv"

    # Add Log file to monitor the changes
    Add-content -Path "C:\Users\CELINE\Desktop\logtest5.txt" `
                -value "$(Get-Date), $($Event.SourceEventArgs.ChangeType), $path"

    # Move file
    Move-Item -Path $path -Destination $targetFile

    # Rename file
    If (Test-Path $targetFile) 
    {
        $renamefile = "C:\Users\CELINE\Desktop\PowerShellChanges2\Request($i).csv"
        Rename-Item -Path $targetFile -NewName $renamefile
    }

    # Execute Notepad
    if ((Test-Path $renamefile) -and ((Get-Process | Where Id -eq $procId) -eq $null))
    {
        $procId = (Start-Process -FilePath "C:\Windows\notepad.exe" -PassThru).Id
    }

    $i++
}


# Register event
Register-ObjectEvent $watcher "Changed" -Action $action | Out-Null

# Wait
while ($true)
{
    Sleep 0
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...