Я пытаюсь исправить имеющийся у меня сценарий 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 , но я не могу себе представить, как я могу понять, как или где добавить это, чтобы заставить это работать так, как я думаю.

2 ответа2

0

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

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

Вдохновленный этим ответом

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

Это то, что я использовал, чтобы заставить его работать. У меня было много переменных ошибок, а также множество проблем, связанных с необходимостью определенных вещей. Я помогал писать это, а также предложения. Журнал наблюдателя очень помог, потому что он дал мне представление о том, что я делал и что происходило.

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

В пакетном файле я могу запускать его без остановки в фоновом режиме, если у кого-то есть лучшее предложение, у меня все уши.

Спасибо за помощь и подтолкнул меня в правильном направлении, хотя, я думаю, что это было намного сложнее, чем нужно.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .