我希望你能解决我的小问题。 有2个不同的文件夹,A和B.
在文件夹A中,有很多DLL的数据。在文件夹B中,还有很多DLL。
例如:
文件夹A:
ThreeServer.Host。的 v13.1 .Core.dll
Hello.This。的 v13.1 .Is.More.dll
文件夹B:
ThreeServer.Host。的 V12.0 .Core.dll
Hello.This。的 V12.0 .Is.More.dll
文件夹A中的所有DLL名称与文件夹B(v12.0)中的DLL的“v13.1”不同。
现在我想用文件夹B中的DLL替换文件夹A中的所有DLL。
全部基于语言 PowerShellISE / Powershell 。
有人知道这个或方法的解决方案吗?
答案 0 :(得分:1)
您需要使用Get-ChildItem
的组合来获取文件列表,使用正则表达式来获取文件名的非版本部分,然后使用通配符来查看目标目录中是否存在匹配项
Get-ChildItem -Path $DLLPath -Filter *.dll |
Where-Object { $_.BaseName -Match '^(.*)(v\d+\.\d+)(.*)$' } |
Where-Object {
# uses $matches array to check if corresponding file in destination
$destFileName = '{0}*{1}.dll' -f $matches[1],$matches[3]
$destinationPath = Join-Path $FolderB $destFileName
# Add the destination file name mask to the pipeline object so we can use it later
$_ | Add-Member NoteProperty -Name DestinationPath -Value $destinationPath
# Check that a corresponding destination exists
Test-Path -Path $_.DestinationPath -ItemType Leaf
} |
Copy-Item -WhatIf -Verbose -Destination {
# Use Get-Item to get the actual file matching the wildcard above.
# But only get the first one in case there are multiple matches.
Get-Item $_.DestinationPath | Select-Object -First 1 -ExpandProperty FullName
}
有关正则表达式的详细信息,请参阅about_Regular_Expressions。
答案 1 :(得分:0)
试试这段代码。
$folderA = "C:\Work\Tasks\test\A"
$folderB = "C:\Work\Tasks\test\B"
$oldVersion="v12.0"
$newVersion="v13.1"
$oldFiles=Get-ChildItem $folderB | ForEach-Object { $($_.Name) }
Get-ChildItem $folderA | ForEach-Object `
{
foreach($oldFile in $oldFiles )
{
if($($_.Name) -eq ($oldFile -replace $oldVersion,$newVersion))
{
Write-host "File Replced: $($_.Name)"
Write-host "File Deleted: $oldFile"
Move-Item $($_.FullName) $folderB
Remove-item "$folderB\$oldFile"
}
}
}