我想为我的程序使用一个循环来抓取该目录的文件夹和子文件夹中只有.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"
答案 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".