Replace Invalid/Illegal/UnSupport Characters in OneDrive for Business
Following Script can be set as a Scheduled task on End User Computers. This script will check for Invalid File Names inside OneDrive([!&{}~#%]) and Rename them. It also stores the Mapping file containing Old name and new name in End User OneDrive(OneDrive Mapping File.csv). Mapping file is appended and not recreated.
$OneDriveLocation = $Env:OneDrive
$SyncFile = $OneDriveLocation + "\OneDrive Mapping File.csv"
function CheckSyncFile()
{
$GetSyncFile = Get-ChildItem $SyncFile -ErrorAction silentlycontinue
if($GetSyncFile -eq $null)
{
$Columns = "Orignal File Name " + ";" + "Updated File Name" + ";" + "Date"
$columns | out-file -filepath $SyncFile -append
}
else
{
}
}
function RenameFile($RenameFileTo)
{
$OrignalFile = $Item.FullName
Rename-Item $item.FullName -NewName ($RenameFileTo)
$ChangeTime = Get-Date -Format "MM-dd-yyyy_hh-mm-ss"
$output = $OrignalFile + ";" + $item.Directory.FullName.ToString() + "\" + $RenameFileTo + "," + $ChangeTime
$output | out-file -filepath $SyncFile -append
}
function FindDuplicate ($NewFileName)
{
$TestFile = $item.Directory.FullName + "\" + $newFileName
$CheckDup = Get-ChildItem $TestFile -ErrorAction silentlycontinue
if($CheckDup -eq $null)
{
$RenameFileTo = $NewFileName
}
else
{
$logTime = Get-Date -displayhint time
$logTime = $logTime.Minute.ToString() + $logTime.Second.ToString()
$SplitExtension = $NewFileName.Split(".")
$FileName = $SplitExtension[0].ToString() + $logTime
$RenameFileTo = ($NewFileName -replace $SplitExtension[0], $FileName)
}
RenameFile $RenameFileTo
}
function CheckFileNames ($item)
{
if($Item.Name -match $UnsupportedChars)
{
$newFileName = $item.Name
if ($Item.Name -match "&") { $NewFileName = ($NewFileName -replace "&", "and") }
if ($Item.Name -match "{") { $NewFileName = ($NewFileName -replace "{", "(") }
if ($Item.Name -match "}") { $NewFileName = ($NewFileName -replace "}", ")") }
if ($Item.Name -match "~") { $NewFileName = ($NewFileName -replace "~", "-") }
if ($Item.Name -match "#") { $NewFileName = ($NewFileName -replace "#", "-") }
if ($Item.Name -match "%") { $NewFileName = ($NewFileName -replace "%", "-") }
if ($Item.Name -match "!") { $NewFileName = ($NewFileName -replace "!", "-") }
if ($NewFileName -ne $item.Name)
{
FindDuplicate $NewFileName
}
}
}
CheckSyncFile
$Items = Get-ChildItem $OneDriveLocation -Recurse -Exclude "OneDrive Mapping File.csv"
$UnsupportedChars = '[!&{}~#%]'
foreach ($item in $items)
{
CheckFileNames $item
}
Credit https://gallery.technet.microsoft.com/office/Check-for-unsupported-6676929a