Powershell循环文件夹,按文件名和位置搜索然后替换

时间:2016-03-28 13:28:45

标签: powershell search

我想为我的程序使用一个循环来抓取该目录的文件夹和子文件夹中只有.dll的文件名。然后,它在指定的位置/路径中搜索具有相同文件名的.dll,如果存在则替换它。到目前为止,我的程序将所有文件从一个位置复制到另一个位置,一旦复制,我需要解决上述问题。

我最大的问题是如何在指定位置的循环中按文件名进行搜索,如果存在,请将其替换为?在使用服务器和其他驱动器放置正确的路径之前,下面的代码是本地随机位置。

#sets source user can edit path to be more precise  

$source = "C:\Users\Public\Music\Sample Music\*"

 #sets destination 

$1stdest = "C:\Users\User\Music\Sample Music Location"

#copies source to destination 

Get-ChildItem $source -recurse | Copy-Item -destination $1stdest 

#takes 1stdest and finds only dlls to variable  

#not sure if this is right but it takes the .dlls only, can you do that in the foreach()? 

Get-ChildItem $1stdest -recurse -include "*.dll"  

1 个答案:

答案 0 :(得分:1)

在这里,您需要重新编辑路径。另请注意,$1stDest已更改为枚举目标文件夹中的文件列表。

逻辑遍历$ source中的所有文件,并在$1stDest中查找匹配项。如果找到了,它会将它们存储在$OverWriteMe中。然后代码逐步遍历每个文件以进行覆盖并复制它。

如上所述,它使用-WhatIf,因此您可以预览在运行之前会发生什么。如果您喜欢所看到的内容,请删除第15行的-WhatIf

$source = "c:\temp\stack\source\"

 #sets destination 

$1stdest = get-childitem C:\temp\stack\Dest -Recurse

#copies source to destination 

ForEach ($file in (Get-ChildItem $source -recurse) ){

    If ($file.BaseName -in $1stdest.BaseName){
        $overwriteMe = $1stdest | Where BaseName -eq $file.BaseName 
        Write-Output "$($file.baseName) already exists @ $($overwriteMe.FullName)" 
        $overwriteMe | ForEach-Object {
             copy-item $file.FullName -Destination $overwriteMe.FullName -WhatIf
             #End of ForEach $overwriteme
             }

        #End Of ForEach $file in ...
        } 


} 

输出

1 already exists @ C:\temp\stack\Dest\1.txt
What if: Performing the operation "Copy File" on target "Item: C:\temp\stack\source\1.txt Destination: C:\temp\stack\Dest\1.txt".
5 already exists @ C:\temp\stack\Dest\5.txt
What if: Performing the operation "Copy File" on target "Item: C:\temp\stack\source\5.txt Destination: C:\temp\stack\Dest\5.txt".