2013-07-04 44 views
-1

我希望你能幫我解決我的小問題。 有2個不同的文件夾,A和B.用不同的名字替換類似的DLL嗎?

在文件夾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」的區別僅在於此。

現在我想用DLL的更換所有DLL在文件夾中的文件夾中B.

所有基於語言PowerShellISE/PowerShell的

有沒有人知道這個或方法的解決方案?

+1

到目前爲止您嘗試了什麼?這是你的功課嗎? – JPBlanc

+0

這是我項目的一個小功能: $ DLL = gci $ FolderA |其中{$ _。extension -eq「.dll」} #$ DLL | Foreach-Object {if(Test-Path $ FolderB \ $ _){robocopy「$ FolderA」「$ FolderB」$ _「}} 但是,如果名稱相似,但此方法正在進行,但** isn 't ** – helpme

回答

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

+0

也許我有一個初始的解決方案,我可以進入文件夾A,然後我得到所有DLL的gci $ DLLPath |其中{$ _。extension -eq「.dll」} | Where-Object {$ _ - 匹配'v13.1'} ...然後我將文件名保存在一個變量和replcae v13.1與v12.0。在此之後,我測試路徑文件夾B中的dll。如果它們相對應,替換文件夾中的名稱v12.0 B與v13.1。然後我可以使用robocopy for coppy dll在文件夾a到文件夾b,對吧? – helpme

+0

@helpme這是一個很好的開始,我更新了我的答案。 –

+0

嘿感謝您的回答,它幾乎工作,文件名在FolderA一直以其名稱中的不同版本號對其他版本進行聲明,但總是會向我顯示whatif whe ñ我開始我的sk,,它不會複製和replcae FolderA'files與新版本號,在文件夾B :(但假設如果方法是非常好的。 – helpme

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