用不同的名称替换类似的DLL?

时间:2013-07-04 11:18:14

标签: powershell

我希望你能解决我的小问题。 有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

有人知道这个或方法的解决方案吗?

2 个答案:

答案 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"
   }   
  }  
}