从powershell中删除特殊字符

从powershell中删除特殊字符

问题描述:

因此,我目前正在尝试将大量终端用户文件从NTFS迁移到MS OneDrive。我面临的问题是,OneDrive不支持文件名中的特殊字符,并且这些文件会与它们混杂在一起。从powershell中删除特殊字符

所以这个想法是将文件和文件夹结构复制到一个新的目的地,并运行一个PS脚本来重命名它们,并从它们中删除所有特殊字符。

Get-childobject -recurse接缝在这里是最好的选择。

我可以使用的东西沿着线重命名一个文件:

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

但是我不能肯定就如何我要么管或支架上这些结合在一起,如果它甚至可能吗?

还是有我忽略的东西,这是更简单吗?

任何帮助,非常感谢!

+1

您好,欢迎*上。请花一些时间阅读帮助页面,尤其是名为[“我可以询问什么主题?”(http://*.com/help/on-topic)和[“我应该问什么类型的问题避免问?“](http://*.com/help/dont-ask)。更重要的是,请阅读[Stack Overflow问题清单](http://meta.stackexchange.com/q/156810/204922)。您可能还想了解[最小,完整和可验证示例](http://*.com/help/mcve)。 – Clijsters

+0

_Get-childobject -recurse接缝在这里是最好的选择_一旦你没有安装任何扩展模块,就没有'Get-ChildObject'。另外,NTFS不支持文件名中的'/'。 – Clijsters

为了总结多个替换操作一起,一个可以包裹[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