监视文件夹并复制到新文件夹并重命名的 PS 脚本

监视文件夹并复制到新文件夹并重命名的 PS 脚本

我想修复我拥有的 PowerShell 脚本并为其添加更多功能。目前,它按预期工作:当文件保存到目录时,它会将项目移动到新目录。

我希望添加的是,它不只是覆盖现有文件,而是将其重命名为yyyyMMdd。这些文件都是相同的,并且始终具有相同的名称/扩展名,因此添加此功能对于某些半版本控制来说是一种很好的方法。

$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

}

我知道我需要将添加到字符串中get-date,但我似乎无法弄清楚如何或在哪里添加它才能使其按照我认为的方式工作。

答案1

您可以尝试使用此逻辑来设置文件的名称

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

灵感来自这个答案

答案2

$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

这是我最终用来让它工作的方法。我遇到了很多变量错误,以及很多关于我需要某些东西的问题。我得到了帮助和建议。观察者日志帮助很大,因为它给了我一个参考点,让我知道我在做什么以及发生了什么。

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

在批处理文件中,我可以让它在后台不停地运行,如果有人对此有更好的建议,我洗耳恭听。

谢谢您的帮助并推动我朝着正确的方向发展,但我认为这比它需要的要困难得多。

相关内容