2016-07-25 192 views
1

我們已經將多個文件服務器遷移到統一的黑盒解決方案中,並有理由將原始源服務器中的某些文件複製回新解決方案,因爲已經有一些從檔案中回收這些文件(即不是經常使用的文件)。使用Powershell替換字符到UNC字符串替換

我已經開始寫代碼來識別文件

$v7Kitems = Get-ChildItem $parentpath -force | where {$_.attributes -match "Offline"} | Select FullName, DirectoryName 

這使信息到一個數組我。 UNC的格式是\\new_server\adminshare\old_server\original_drive\original_local_directory_structure\file

我希望使用替換選項爲舊文件位置創建一個新變量,然後使用Get-Item將文件複製回去,因此也將「DirectoryName」拉回來。

Foreach($item in $v7Kitems){ 
    $source=$item.FullName -replace "\\\\new_server\\adminshare\\","\\" -replace "\\[E-Z]\\","\<original_drive>$\" 
} 

我不知道我應該在\\[E-Z]\\替換部分使用,如驅動器盤符是不能跨服務器保持一致。到這一點的字符串長度是一致的長度。也許我不應該使用RegEx替換,而是其他一些類型,它在驅動器號的字符數處捕獲該字母,然後將其作爲變量插入替換字符串中?

什麼是Oracle的溢出的想法?

傑夫

+1

'-replace'\\([e-z])\\','\ $ 1 $ \'' –

+0

感謝您的建議。我已經嘗試過這種改變,並將輸出更改爲'\\ old_server \ $ \ original_local_directory_structure \ file',該文件沒有適當的驅動器號。我應該試圖將變量'$ 1'作爲驅動器號? – Geoff

+0

我可以解決我的問題,而是'的foreach($在$ v7Kitems項目){ \t $ uncsplit = $ item.FullName.split( 「\」) \t $驅動= $ uncsplit [5] \t $源= $ item.FullName -replace「\\\\ new_server \\ adminshare \\」,「\\」 - 替換「\\([ez])\\」,「\ $ drive $ \」 }'似乎給正確的輸出。如果路徑構造是預期的並且一致的,那麼爲什麼不應該這樣做? – Geoff

回答

0

由於Mathias在他的評論中指出的,你需要把盤符比賽中捕獲組,所以你可以用反向引用匹配後跟一個$字符替換:

-replace '\\([e-z])\\','\$1$\' 

請注意,您需要圍繞替換表達式使用單引號,否則PowerShell會在正則表達式引擎查看替換字符串之前將(空)PowerShell變量擴展爲$1