Файл создается автоматически, скрипт должен автоматически переименовывать и перемещать его, но они не перемещаются - PullRequest
0 голосов
/ 24 июня 2019

долгое время слушатель, вызывающий в первый раз,

Мне нужно создать скрипт Powershell (версия 2 или ниже), который:

-контрольно отслеживает один конкретный каталог на предмет новых / измененныхfiles - записывает файл, который был создан с отметкой даты / времени в файле журнала, который: - создается ежедневно с именем «log Date / Time.txt» - переименовывает файл, добавляя дату / время -регистрирует, что он переименовал его - сопоставляет диск с определенной комбинацией имени пользователя и пароля - перемещает его из dirA в dirB (подключенный диск - dirB) - записывает, что он перемещал его - отключает диск - если по какой-либо причине он прекратил работать, и мызапустите его снова, он переименует, сопоставит диск, переместит, разархивирует диск и зарегистрирует все файлы в dirA в dirB

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

Я смотрел на это более недели и устал от удара головой о стол.Может ли кто-нибудь, ПОЖАЛУЙСТА, избавить меня от моих страданий и сообщить, что я сделал неправильно?

СПАСИБО заранее!

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

В поле ниже я поместил основную часть скрипта, которая работает некорректно. Она переименовывает файлы по мере их поступления, но непереместите их.

$rename = $_.Name.Split(".")[0] + "_" + ($_.CreationTime | Get-Date -Format MM.dd.yyy) + "_" + ($_.CreationTime | Get-Date  -Format hh.mm.ss) + ".log"

Write-Output "File: '$name' exists at: $source - renaming existing file first" >> $scriptlog

Rename-Item $_ -NewName $rename

Wait-Event -Timeout 3

Move-Item "$_($_.Directory)$name" -destination $destination

Write-Output "File: '$name' moved to $destination on $date" >> $scriptlog

Весь код доступен ниже:

#Log Rename/Move script
$userName = "copyuser"
$newpass = Read-Host -Prompt 'Type the new Password'
$password = ConvertTo-SecureString -String $newpass -AsPlainText -Force

$PathToMonitor = "C:\Users\Administrator\Desktop\FolderA"
$destination = "C:\Users\Administrator\Desktop\FolderB"
$scriptlog = "C:\Users\Administrator\Desktop\ScriptLogs\" + [datetime]::Today.ToString('MM-dd-yyy') + "_TransferLog.txt"

$FileSystemWatcher = New-Object System.IO.FileSystemWatcher
$FileSystemWatcher.Path  = $PathToMonitor
$FileSystemWatcher.IncludeSubdirectories = $false
$FileSystemWatcher.EnableRaisingEvents = $true

$dateTime = [datetime]::Today.ToString('MM-dd-yyy') + " " + [datetime]::Now.ToString('HH:mm:ss')
Write-Output "*******************************************************************************************" >> $scriptLog
Write-Output "*********************Starting Log Move Script $dateTime**********************" >> $scriptLog
Write-Output "*******************************************************************************************" >> $scriptLog

$Action = {
$details = $event.SourceEventArgs
$Name = $details.Name
$FullPath = $details.FullPath
$OldFullPath = $details.OldFullPath
$OldName = $details.OldName
$ChangeType = $details.ChangeType
$Timestamp = $event.TimeGenerated
$text = "{0} was {1} at {2}" -f $FullPath, $ChangeType, $Timestamp
Write-Output "" >> $scriptlog
Write-Output $text >> $scriptlog


switch ($ChangeType)
{
    'Changed' { "CHANGE"
        Get-ChildItem -path $FullPath -Include *.log | % {
            $rename = $_.Name.Split(".")[0] + "_" + ($_.CreationTime | Get-Date -Format MM.dd.yyy) + "_" + ($_.CreationTime | Get-Date  -Format hh.mm.ss) + ".log"
            Write-Output "File: '$name' exists at: $source - renaming existing file first" >> $scriptlog
            Rename-Item $_ -NewName $rename
            Wait-Event -Timeout 3
            Move-Item "$_($_.Directory)$name" -destination $destination
            Write-Output "File: '$name' moved to $destination on $date" >> $scriptlog
        }
    }    
    'Created' { "CREATED"
        Get-ChildItem -path $FullPath -Include *.log | % {
            $rename = $_.Name.Split(".")[0] + "_" + ($_.CreationTime | Get-Date -Format MM.dd.yyy) + "_" + ($_.CreationTime | Get-Date  -Format hh.mm.ss) + ".log"
            Write-Output "File: '$name' exists at: $source - renaming existing file first" >> $scriptlog
            Rename-Item $_ -NewName $rename
            Wait-Event -Timeout 3
            Move-Item "$($_.Directory)$rename" -Destination $destination
            Write-Output "File: '$name' moved to $destination on $date" >> $scriptlog
        }
    }
    'Deleted' { "DELETED"
    }
    'Renamed' { 
    }
    default { Write-Output $_ >> $scriptlog}
}
}

$handlers = . {
Register-ObjectEvent -InputObject $FileSystemWatcher -EventName Changed -Action $Action -SourceIdentifier FSChange
Register-ObjectEvent -InputObject $FileSystemWatcher -EventName Created -Action $Action -SourceIdentifier FSCreate
}

Write-Output "Watching for changes to $PathToMonitor" >> $scriptlog

try
{
do
{
    Wait-Event -Timeout 1
    Write-host "." -NoNewline

} while ($true)
}
finally
{
# EndScript
Unregister-Event -SourceIdentifier FSChange
Unregister-Event -SourceIdentifier FSCreate
$handlers | Remove-Job
$FileSystemWatcher.EnableRaisingEvents = $false
$FileSystemWatcher.Dispose()
write-output "Event Handler disabled." >> $scriptlog
}

1 Ответ

0 голосов
/ 24 июня 2019

Ну, я нашел свою проблему. Тупой вопрос, если я посмотрю на это и подумаю Именно так я и вызывал текущий каталог, содержащий файлы для перемещения после переименования.

Move-Item "$_($_.Directory)$name" -destination $destination

Проблема в приведенном выше коде - это "$ ($ .Directory). Оно должно быть:

Move-Item -path $PathToMonitor$name -destination $destination

Другие вещи могут работать, и могут быть лучше, но по крайней мере это устраняет проблему с переименованием, которая у меня была.

Теперь добавьте Mapping Drive и другие вещи, необходимые для полного завершения того, что мне нужно.

Если я подумаю об этом, я опубликую весь свой код, когда это будет сделано для кого-то еще, это может помочь в будущем.

...