Фильтрация неизвестного символа для загрузки 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

Другие вопросы по тегам