如何使用Powershell使用无限循环处理复制文件?

时间:2019-10-18 01:49:42

标签: powershell

我要检查第二个文件夹中的.jpg文件。第二个文件夹有一些子文件夹。如果.jpg在第二个文件夹的子文件夹中存在,我将根据基本名称将文件从第一个文件夹复制到第二个文件夹的子文件夹。我可以参考出色的答案来做这部分。如何使用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 个答案:

答案 0 :(得分:1)

文件管理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 ($job.Hash -ne $dst.Hash)
{Copy-Item $job.Path $dst.Path}
Else
{
    #Do nothing
}

当然还有其他方法可以做到这一点,这只是一个主意。