Фильтрация неизвестного символа для загрузки OneDrive
В настоящее время используется небольшой скрипт powershell для проверки недопустимых символов в файловой структуре, но я столкнулся с персонажем, с которым я не знаком. Мне нужно изменить код для обнаружения и замены того, что этот символ (или представляет), но я не могу физически набрать символ, он отображается только при просмотре в проводнике файлов. Символ отображается в виде квадратного маркера, но изменится на поле с вопросительным знаком, если я скопирую / вставлю его где-нибудь Кто-нибудь знает альтернативный код для этого персонажа? Или альтернативную линию, которую я могу использовать, чтобы обнаружить и заменить ее?
код, в который нужно войти, находится ниже:
function OneDrive-Check($Folder,[switch]$Fix){
$Items = Get-ChildItem -Path $Folder -Recurse
$UnsupportedChars = '[!&{}~#%]'
foreach ($item in $items){
filter Matches($UnsupportedChars){
$item.Name | Select-String -AllMatches $UnsupportedChars |
Select-Object -ExpandProperty Matches
Select-Object -ExpandProperty Values
}
$newFileName = $item.Name
Matches $UnsupportedChars | ForEach-Object {
Write-Host "$($item.FullName) has the illegal character $($_.Value)" -ForegroundColor Red
if ($_.Value -match "&") { $newFileName = ($newFileName -replace "&", "and") }
if ($_.Value -match "{") { $newFileName = ($newFileName -replace "{", "(") }
if ($_.Value -match "}") { $newFileName = ($newFileName -replace "}", ")") }
if ($_.Value -match "~") { $newFileName = ($newFileName -replace "~", "-") }
if ($_.Value -match "#") { $newFileName = ($newFileName -replace "#", "") }
if ($_.Value -match "%") { $newFileName = ($newFileName -replace "%", "") }
if ($_.Value -match "!") { $newFileName = ($newFileName -replace "!", "") }
}
if (($newFileName -ne $item.Name) -and ($Fix)){
Rename-Item -LiteralPath $item.FullName -NewName ($newFileName)
Write-Host "$($item.Name) has been changed to $newFileName" -ForegroundColor Green
}
}
}
Изображение персонажа ниже, по обе стороны от даты:
Неизвестный незаконный персонаж
Спасибо!
2 ответа
Вместо того, чтобы пытаться сопоставить недопустимые символы как [string]
Я бы попытался определить недопустимый символ как код символа Unicode.
Для этого примера сначала ваше имя файла примерно так:
$name = $item.FullName
$name[0..$name.Length] | % {
"$_ = \u$(([int64]$_).ToString('X4'))"
}
Таким образом, вы получите фактические коды Unicode:
a = \u0061
k = \u006B
o = \u006F
s = \u0073
...
А затем отфильтруйте / замените результаты на основе кодов Unicode, указанных как \u0000
как шестнадцатеричный код символа юникода, что-то вроде:
$String -replace '\u005A\u0061\u007A', ''
Здесь вы можете найти несколько замечательных примеров замены юникода:
Изменение кодовой страницы системы может избавить вас от программирования функции фильтра. Попробуйте командную строку windows 'chcp' с хорошей кодовой страницей.
https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/chcp