Как программно переименовать файл, содержащий разложенные символы? - PullRequest
0 голосов
/ 24 августа 2018

Мне иногда приходится иметь дело с файлами, созданными в среде Mac, и с именами файлов, содержащими разложенные символы (выглядит как «é», но на самом деле это «e´»). Они явно не распознаются Scripting.FileSystemObject и поэтому не могут быть использованы. Мне нужно программно переименовать эти файлы, чтобы удалить разложенные символы перед дальнейшей обработкой.

Из того, что я нашел: "é (U + 00E9) - это символ, который можно разложить на эквивалентную строку базовой буквы e (U + 0065) и объединить острый акцент (U + 0301)."

Другими словами, обе строки выглядят в точности так: «é», но длина первой равна 1, а длина второй - 2. Если преобразовано, то на самом деле это выглядит как «e´».

Вот небольшой скрипт для тестирования:

(Пожалуйста, создайте эти два тестовых файла, скопировав / вставив имена) Имя файла с составным символом (рабочий): é.txt

Имя файла с разложенным символом (не работает): é.txt

Set args = WScript.Arguments
Set FSO = CreateObject("Scripting.FileSystemObject") 
For Each Arg in Wscript.Arguments 

Set objFile = FSO.GetFile(Arg)
fPath = Left(objFile.Path, Len(objFile.Path)-Len(objFile.Name))

FSO.movefile arg, fpath & "a.txt"
Set objFile = Nothing
Set FSO = Nothing

next

Файл с разложенным символом выдает ошибку «Файл не найден». Мне удалось преобразовать строку из разложенных в составные символы, но все еще не работал при попытке переименовать реальный файл.

Я полностью застрял в этой точке, и любая помощь будет высоко оценена! Заранее спасибо.

1 Ответ

0 голосов
/ 25 августа 2018

Это связано с VBS / WSH DropHandler (HKEY_CLASSES_ROOT\VBSFile\ShellEx\DropHandler)

DropHandler файлов VBS / WSH - {60254CA5-953B-11CF-8C96-00AA00B8708C}.
Файлы EXE / BAT / CMD обрабатываются {86C86720-42A0-1069-A2E8-08002B30309D}.

Обработчик отбрасывания VBS / WSH анализирует удаленный объект (ы) по длинному пути к файлу, а обработчик отбрасывания EXE / BAT / CMD анализирует удаленный объект (ы) по короткому пути к файлу (например, C: \ PROGRA ~ 1).

Проблема в том, что DropHandler из VBS не анализирует отброшенный объект способом Unicode.

Ваш код полагается на предметы, которые отбрасываются, очевидно, поэтому вы полагаетесь на WScript.Arguments.

Функции FSO МОГУТ обрабатывать имена файлов, как вы описываете. Вы можете проверить это, выполнив

Set objFile = FSO.GetFile("<PATH>\e´.txt")`

или даже

FSO.FileExists("<PATH>\e´.txt")

Однако, входя через аргументы, имена файлов уже урезаны обработчиком дропа. Я не вижу безопасного способа изменить это поведение, кроме как возиться в реестре Windows или изменить сценарий так, чтобы он не использовал «drag-'n-drop», но, возможно, получал имена файлов из диалога OpenFile.

...