Script PS qui surveille le dossier et les copie dans un nouveau dossier et les renomme

0

Je cherche à corriger un script PowerShell que je possède et à lui ajouter des fonctionnalités supplémentaires. Actuellement, il fonctionne comme prévu: lorsqu'un fichier est enregistré dans un répertoire, l'élément est déplacé dans un nouveau.

Ce que je cherche à ajouter, c’est au lieu de simplement écraser le fichier existant, mais de le renommer yyyyMMdd. Les fichiers sont tous identiques et portent toujours le même nom / extension. Il serait donc judicieux d’ajouter ceci, ce qui serait très utile pour un contrôle de version semi-automatique.

$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

}

Je comprends que je dois ajouter get-datequelque chose à la ficelle , mais je ne peux pas sembler si longtemps que je sache comment ou où ajouter cela pour que cela fonctionne comme je le pense.

Matt King
la source
Salut! En gros, tout ce que vous avez fait est de nous dire ce que vous voulez et de nous donner le script que vous avez qui ne le fait pas. Nous ne sommes pas un service de rédaction de scripts, mais pouvons / allons vous aider avec le problème de script spécifique que vous rencontrez. Veuillez modifier votre question pour inclure la réponse à: Qu'avez-vous déjà essayé? Quels ont été les résultats? Où êtes-vous coincé dans la mise en œuvre de cette nouvelle fonctionnalité? Sinon, cela peut / sera fermé car trop large.
cʜιᴇ007
Mon erreur, j'ai mis à jour l'une des choses que j'ai essayée. J'ai essayé beaucoup d'autres méthodes, mais je pense soit à A: tout casser, soit à B: cela semble juste aller au-delà et tout écrase.
Matt King

Réponses:

0

Vous pouvez essayer d'utiliser cette logique pour définir le nom du fichier.

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

Inspiré par cette réponse

Zulgrib
la source
Jouant avec ce que vous avez écrit, il ajoute maintenant un nouveau fichier au lieu d’écraser l’ancien, de sorte que j’obtiens un nouveau document Microsoft Word, je reçois maintenant un nouveau document Microsoft Word (2) .docx Certainement un aller dans la bonne direction, comme auparavant, il faudrait simplement écraser.
Matt King
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

C'est ce que j'ai fini par utiliser pour le faire fonctionner. J'ai eu beaucoup d'erreurs variables ainsi que de nombreux problèmes concernant le besoin de certaines choses. J'ai eu de l'aide pour l'écrire ainsi que des suggestions. La bûche d’observateur a beaucoup aidé, car elle m’a donné une idée de ce que je faisais et de ce qui se passait.

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

Dans un fichier batch, cela me permet de le lancer sans interruption en arrière-plan. Si quelqu'un me le suggère mieux, je suis tout ouïe.

Merci pour l'aide et pour m'avoir poussé dans la bonne direction, je pense que c'était beaucoup plus difficile que nécessaire.

Matt King
la source