2017-11-25 269 views
1

因此,我目前正在嘗試將大量終端用戶文件從NTFS遷移到MS OneDrive。我面臨的問題是,OneDrive不支持文件名中的特殊字符,並且這些文件會與它們混雜在一起。從powershell中刪除特殊字符

所以這個想法是將文件和文件夾結構複製到一個新的目的地,並運行一個PS腳本來重命名它們,並從它們中刪除所有特殊字符。

Get-childobject -recurse接縫在這裏是最好的選擇。

我可以使用的東西沿着線重命名一個文件:

$newname = $oldname.replace ("&"," and ") 
$newname = $newname.replace (" & "," and ") 
$newname = $newname.replace ("/"," ") 
#etc... 

但是我不能肯定就如何我要麼管或支架上這些結合在一起,如果它甚至可能嗎?

還是有我忽略的東西,這是更簡單嗎?

任何幫助,非常感謝!

+1

您好,歡迎StackOverflow上。請花一些時間閱讀幫助頁面,尤其是名爲[「我可以詢問什麼主題?」(http://stackoverflow.com/help/on-topic)和[「我應該問什麼類型的問題避免問?「](http://stackoverflow.com/help/dont-ask)。更重要的是,請閱讀[Stack Overflow問題清單](http://meta.stackexchange.com/q/156810/204922)。您可能還想了解[最小,完整和可驗證示例](http://stackoverflow.com/help/mcve)。 – Clijsters

+0

_Get-childobject -recurse接縫在這裏是最好的選擇_一旦你沒有安裝任何擴展模塊,就沒有'Get-ChildObject'。另外,NTFS不支持文件名中的'/'。 – Clijsters

回答

1

爲了總結多個替換操作一起,一個可以包裹[String]Replace()方法等:

$newName = $oldName.Replace("&", "and").Replace("_", "-") #etc. 

,或者使用PowerShells內置-replace操作者:

$newName = $oldname -replace "&", "and" -replace "_", "-" #etc. 

一般配合字符串到約定有是像[uri]::EscapeDataString()這樣的方法。我不確定OneDrive和他們的文件名稱慣例,但可以想象他們必須轉換爲互聯網URL。


爲了使其更具可讀性一個可以建立一個HashTable類似如下:

$replacements = @{ 
    "&" = "and"; 
    "_" = "-"; 
    "/" = "-"; 
} 
$fileName = "Actually/IsSupportedByNeitherNTFSNorOneDrive" 
$replacements.Keys | ForEach-Object {$fileName = $fileName.replace($_, $replacements[$_])} 
Write-Output $fileName 
#Actually-IsSupportedByNeitherNTFSNorOneDriveandsomeOthers