Как обработать файл копирования с помощью бесконечного цикла с помощью Powershell? - PullRequest
0 голосов
/ 18 октября 2019

Я хочу проверить файл .jpg во 2-й папке. Вторая папка имеет некоторую подпапку. если .jpg существует в подпапке 2-й папки, я скопирую файл из 1-й папки в подпапку 2-й папки на основе базового имени. Я могу сделать эту часть, обратитесь к этому отличному ответу. Как скопировать файл на основе соответствующего имени файла с помощью PowerShell? https://stackoverflow.com/a/58182359/11066255

Но я хочу сделать этот процесс с бесконечным циклом. Как только я использую бесконечный цикл, я обнаружил, что у меня много дубликатов файлов. Как сделать ограничение, если я уже скопировал файл, я не буду копировать снова в следующем цикле. Любой может помочь мне, пожалуйста. Спасибо. enter image description here

for(;;)
{
$Job_Path = "D:\Initial"
$JobError = "D:\Process"

Get-ChildItem -Path "$OpJob_Path\*\*.jpg" | ForEach-Object {
    $basename = $_.BaseName.Substring(15)
    $job = "$Job_Path\${basename}.png"
    if (Test-Path $job) {
        $timestamp = Get-Date -Format 'yyyyMMddhhmmss'
        $dst = Join-Path $_.DirectoryName "${timestamp}_${basename}.gif"
        $Get = (Get-ChildItem -Name "$OpJob_Path\*\*$basename.jpg*" | Measure-Object).Count
        Copy-Item $job $dst -Force
    }
}
}

1 Ответ

1 голос
/ 18 октября 2019

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

Также лично я бы предложил использовать PowerShell FileSystemWatcher вместо бесконечного цикла. Просто сказать ...

Эта строка ...

$timestamp = Get-Date -Format 'yyyyMMddhhmmss'

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

Либо удалите / измените эту строку на что-то другое, либо используйте хэш файла (они гарантируют уникальность независимо от используемого имени) ...

Get-FileHash -Path 'D:\Temp\input.txt'

Algorithm       Hash                                                                   Path
---------       ----                                                                   ----
SHA256          1C5B508DED35A28B9CCD815D47ECF500ECF8DDC2EDD028FE72AB5505C0EC748B       D:\Temp\input.txt

... для сравненияи перед копией, если другой if / then.

что-то вроде ...

If ($job.Hash -ne $dst.Hash)
{Copy-Item $job.Path $dst.Path}
Else
{
    #Do nothing
}

Конечно, есть и другие способы сделать это, это всего лишь одна идея.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...