Script PS que monitora a pasta e copia para a nova pasta e renomeia

0

Estou tentando corrigir um script do PowerShell que tenho e adicionar mais alguns recursos a ele. Atualmente, está funcionando conforme o esperado: quando um arquivo é salvo em um diretório, ele é movido para um novo.

O que eu quero adicionar é que, em vez de apenas sobrescrever o arquivo existente, ele renomeia para yyyyMMdd . Os arquivos são todos iguais e são sempre o mesmo nome / extensão, então adicionar isso seria uma ótima maneira de algum controle de versão semi.

$folder = 'C:\scripts\test'
$filter = '*.*'                             # <-- set this according to your requirements
$destination = 'H:\Office Documents\text_move'
$fsw = New-Object IO.FileSystemWatcher $folder, $filter -Property @{
 IncludeSubdirectories = $true              # <-- set this according to your requirements
 NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'
}

$onCreated = Register-ObjectEvent $fsw Created -SourceIdentifier FileCreated -Action {
 $path = $Event.SourceEventArgs.FullPath
 $name = $Event.SourceEventArgs.Name
 $changeType = $Event.SourceEventArgs.ChangeType
 $timeStamp = $Event.TimeGenerated
 Write-Host "The file '$name' was $changeType at $timeStamp"
 $dirname = [io.path]::GetDirectoryName($folder)
 $filename=[io.path]::GetFileNameWithoutExtension($file)
 $ext = [io.path]::GetExtension($file)
 $newpath = "$destination\$filename\$(get-date -f yyyyMMdd)$ext"
 Move-Item $path -Destination $destination -verbose

}

Eu entendo que preciso adicionar à string get-date , mas não consigo imaginar como ou onde adicionar isso para que funcione da maneira que eu acho que deveria.

    
por Matt King 25.11.2015 / 15:11

2 respostas

0
$folder = 'C:\scripts\test'
$filter = '*.*'

$fsw = New-Object IO.FileSystemWatcher $folder, $filter -Property @{
IncludeSubdirectories = $true
NotifyFilter = [IO.NotifyFilters]'FileName, LastWrite'
}

$onCreated = Register-ObjectEvent $fsw Created -SourceIdentifier FileCreated -Action {
# define the destination inside this script block
$destination = 'H:\Office Documents\text_move'

$createdFile = $Event.SourceEventArgs.FullPath
$createdFileName = $Event.SourceEventArgs.Name
$changeType = $Event.SourceEventArgs.ChangeType
$createdFileTimeStamp = $Event.TimeGenerated

Write-Output "Trigger: Get-Date -Format 'u'" >> c:\scripts\logWatcher.txt

$existingFileName = Join-Path -Path $destination -ChildPath $createdFileName
if(Test-Path($existingFileName)) {
Write-Output "File: '$createdFileName' exists at: $destination - renaming existing file first" >> c:\scripts\logWatcher.txt
$newFileName = "$(get-date -Format 'yyyyMMdd')$createdFileName"
Rename-Item -Path $existingFileName -NewName $newFileName
}

Move-Item $createdFile -Destination $existingFileName -verbose
Write-Output "File: '$createdFileName' State: $changeType At: $createdFileTimeStamp" >> c:\scripts\logWatcher.txt
Start-Process https://website.blah/app.jnlp

}
$onCreated

Isso é o que acabei usando para fazer funcionar. Eu tive muitos erros variáveis, assim como muitos problemas com os quais eu precisava de certas coisas. Eu tive ajuda para escrevê-lo, bem como sugestões. O registro do observador ajudou muito porque me deu um ponto de referência para o que eu estava fazendo e o que estava acontecendo.

@echo off
powershell.exe -noexit -file "c:\scripts\move-filefinal.ps1"

Em um arquivo de lote, posso executá-lo sem parar em segundo plano, se alguém tiver uma sugestão melhor para isso, sou todo ouvidos.

Obrigado pela ajuda e me empurrando na direção certa, acho que isso foi muito mais difícil do que precisava ser.

    
por 07.12.2015 / 19:23
0

Você pode tentar usar essa lógica para definir o nome do arquivo

$dirName  = [io.path]::GetDirectoryName($folder)
$filename = [io.path]::GetFileNameWithoutExtension($file)
$ext      = [io.path]::GetExtension($file)
$newPath  = "$destination\$filename $(get-date -f yyyy-MM-dd)$ext"

Inspirado por esta resposta

    
por 25.11.2015 / 16:46

Tags