2017-04-05 59 views
0

我有一个jpg格式的图像文件夹称为“finalpics”,另一个文件夹(“sourcepics”),其中有几个子文件夹包含各种格式的RAW文件。基于其他文件的存在复制文件(Windows)

我需要一个脚本(批处理文件?),只有当该文件存在于“finalpics”中时,才会将所有文件从“sourcepics”及其子文件夹复制到另一个文件夹(“sourcefinal”)。

举个例子:

“finalpics” 包含文件名为mypic1.jpg,mypic2.jpg,mypic3.jpg。

“sourcepics”包含名为mypic1.dng,mypic2.psd,mypic3.cr2,yourpic1.dng,yourpic2.psd,yourpic3.cr2的文件。

我想让脚本将“mypic”文件,而不是'yourpic'文件复制到“sourcefinal”。

“finalpics”中有超过1000个jpgs,但在“sourcepics”的各个子文件夹中可能有40,000个文件。

希望是有道理的。

感谢您的期待。

+1

你到目前为止尝试过什么?看看'Get-ChildItem'和'Test-Path' – dbso

+0

在你的评论中有一个对“mainpics”的引用,但在你的例子中没有提到它。这有点令人困惑。 – Robin

+0

对不起,我已经编辑过这个帖子。 – JDG

回答

1

我认为这个PowerShell代码会做你以后的事情;

# Define your folder locations: 
$SourcePicsFolder = 'C:\SourcePics' 
$FinalPicsFolder = 'C:\FinalPics' 
$SourceFinalFolder = 'C:\SourceFinal' 

# Get existing files into arrays: 
$SourcePics = Get-ChildItem -Path $SourcePicsFolder -Recurse 
$FinalPics = Get-ChildItem -Path $FinalPicsFolder -Recurse 

# Loop all files in the source folder: 
foreach($file in $SourcePics) 
{ 
    # Using the basename property (which ignores file extension), if the $FinalPics 
    # array contains a basename equal to the basename of $file, then copy it: 
    if($FinalPics.BaseName -contains $file.BaseName) 
    { 
     Copy-Item -Path $file.FullName -Destination $SourceFinalFolder 
    } 
} 

注:有基于文件类型没有过滤(例如,它会复制所有它将从“SourcePics”到“SourceFinal”如果他们在FinalPics存在复制的同名文件(忽略文件扩展名)文件)。另外,如果你的'SourcePics'文件夹有两个相同文件名但在不同子文件夹中的图像,并且'FinalPics'中也存在这个名字的文件,那么当它试图复制第二次。要覆盖,请使用Copy-Item命令中的-Force参数。

我用'SourcePics'中的一些.dng文件和'FinalPics'中的.jpg文件测试了上述代码,并且它工作(忽略了yourpic文件)。

+0

非常感谢这位罗宾,我用一些文件做了一个快速测试,它确实可以工作。当它在全套文件上运行时,它会为我节省大量时间。只是出于兴趣,如果我想要文件过滤(比如只是* .dng和* .crw文件)就是一个简单的选项? – JDG

+0

不客气,当然。你可以使用下面的代码:'$ SourcePics = Get-ChildItem -Path $ SourcePicsFolder -Recurse -Include @(“*。dng”,“*。crw”)'。这只会在源图片列表中包含.dng和.crw文件,因此它只会被复制过来(如果匹配)。 – Robin

相关问题