Папка с именем Unicode показывает ? в приглашении wscript

У меня проблемы с папками с именами Unicode. Когда я перетаскиваю папку в скрипт, он неправильно показывает путь к папке.

Простой VBScript (это лишь его часть):

Dim Wshso : Set Wshso = WScript.CreateObject("WScript.Shell")
Dim FSO : Set FSO = CreateObject("Scripting.FileSystemObject")

If WScript.Arguments.Count = 1 Then
    If FSO.FileExists(Wscript.Arguments.Item(0)) = true and FSO.FolderExists(Wscript.Arguments.Item(0)) = false Then
        Alert "You dragged a file, not a folder! My god." & vbcrlf & "Script will terminate immediately", 0, "Alert: User is stupid", 48
        WScript.Quit
    Else
        targetDir = WScript.Arguments.Item(0)
        Wshso.Popup targetDir
    End If
Else
    targetDir = Wshso.SpecialFolders("Desktop")
    Alert "Note: No folder to traverse detected, default set to:" & vbcrlf & Wshso.SpecialFolders("Desktop"), 0, "Alert", 48
End If

Если это обычный путь без символов Unicode, все в порядке. Но в этом случае: Директория: 4minute (포미닛) - Hit Your Heart

Затем он покажет что-то вроде 4minute (?) - Hit Your Heart

И если я делаю FolderExists, он не может найти перетаскиваемую папку.

Есть ли обходной путь для поддержки папок с именами Unicode?

Спасибо!

Я отредактирую, если это недостаточно ясно


person Alex Cheng    schedule 06.12.2010    source источник


Ответы (4)


Похоже, это проблема, характерная для Расширение оболочки DropHandler. Тогда как:

test.vbs "C:\포미닛.txt"
C:\WINDOWS\System32\WScript.exe "test.vbs" "C:\포미닛.txt"

оба работают при вводе с консоли (даже если консоль не может отображать хангыль, поэтому он выглядит как ?), операция перетаскивания, которая должна привести к одной и той же команде, проходит через перевод Unicode-> ANSI-> Unicode, который теряет все символы, которых нет в текущей кодовой странице ANSI. (Поэтому 포미닛 будет работать с установленной по умолчанию корейской Windows, но не с западной.)

Я не знаю, как правильно решить проблему. Возможно, вы могли бы обойти это, изменив DropHandler для файлов .vbs в реестре:

HKEY_CLASSES_ROOT\VBSFile\ShellEx\DropHandler\(Default)

от WSH DropHandler ({60254CA5-953B-11CF-8C96-00AA00B8708C}) до {86C86720-42A0-1069-A2E8-08002B30309D}, используемого для .exe, .bat и подобных, который не страдает от этой проблемы. Вам также, вероятно, придется изменить ассоциацию файлов для .vbs, чтобы также заключать в кавычки аргумент имени файла, поскольку EXE DropHandler этого не делает, чтобы избежать проблем с пробелами в именах файлов.

Поскольку это влияет на передачу аргументов для всех файлов VBS, было бы рискованно развертывать исправление на любой машине, кроме вашей. Если вам нужно это сделать, возможно, вы могли бы попробовать создать новое расширение файла с соответствующим DropTarget, а не изменять сам VBSFile? Или, может быть, отказаться от поведения drop-on-to-script и вместо этого предоставить диалоговое окно открытия файла или поле ручного перетаскивания.

person bobince    schedule 06.12.2010
comment
Благодарю за разъяснение. Я не знаю о DropHandler (новичок в VBScript), я почитаю об этом. Я только что узнал, что могу делать .BrowseForFolder. Но если я использую это, я все равно могу перетащить папку в скрипт, и скрипт все равно запустится. Есть ли какой-нибудь способ его отключить? Спасибо! - person Alex Cheng; 06.12.2010
comment
Я приму этот ответ, если в течение 24 часов никто не сможет предоставить окончательное решение этой проблемы. знак равно - person Alex Cheng; 06.12.2010
comment
Вы не можете запретить добавление .vbs, нет (во всяком случае, не удаляя расширение DropHandler для всех файлов .vbs). Я предполагаю, что лучше всего было бы по-прежнему принимать удаленные файлы и просто открывать ошибку, если они не могут быть найдены из-за проблемы с Unicode. Затем используйте браузер папок. - person bobince; 06.12.2010
comment
Да, я проверил аргумент и сообщил пользователю, что перетаскивание не поддерживается, и продолжил подсказку выбора папки. Я буду винить в этом обработчик WSH по умолчанию, и я думаю, что его создание слишком кропотливо. Ответ принят. Спасибо! - person Alex Cheng; 07.12.2010

Для всех, кто попадает сюда из Google...

Совет Бобинса помог мне обойти эту проблему, поместив мой файл vbscript (myscript.vbs) в пакетный файл DOS (mybatch.bat).

Совет был:

«Кажется, это проблема, характерная для расширения оболочки DropHandler Windows Script Host, тогда как… тот, который используется для .exe, .bat и подобных… не страдает от этой проблемы».

mybatch.bat содержит:

:Loop
IF "%1"=="" GOTO Continue
     set allfiles=%allfiles% "%1"
SHIFT
GOTO Loop
:Continue
"myscript.vbs" %allfiles%

Вы также можете найти этот код из моего myscript.vbs, чтобы быть полезным

For Each strFullFileName In Wscript.Arguments
  ' do stuff
Next
person DG.    schedule 27.11.2012
comment
не могли бы вы расширить свой ответ и привести полный пример своего кода? - person Qbik; 03.07.2015

Основываясь на ответе DG, если вы просто хотите принять один файл в качестве цели перетаскивания, вы можете написать пакетный файл (если он у вас называется «x.bat», поместите VBScript с именем файла «x.bat.vbs» в ту же папку) который просто содержит:

@"%0.vbs" %1

@ означает, что строка не выводится на дисплей (я обнаружил, что она показывает мусорный текст, даже если вы используете chcp 1250 в качестве первой команды)

не используйте двойные кавычки вокруг %1, это не сработает, если ваш VBScript использует логику, подобную следующей (код, который я использовал ниже, был взят из http://jeffkinzer.blogspot.com/2012/06/vbscript-to-convert-excel-to-csv.html< /а>). Протестировал его, и он отлично работает с пробелами в именах файлов и папок:

  Dim strExcelFileName
  strExcelFileName = WScript.Arguments.Item(0) 'file name to parse

  ' get path where script is running
  strScript = WScript.ScriptFullName
  Dim fso
  Set fso = CreateObject ("Scripting.FileSystemObject") 
  strScriptPath = fso.GetAbsolutePathName(strScript & "\..")
  Set fso = Nothing

  ' If the Input file is NOT qualified with a path, default the current path
  LPosition = InStrRev(strExcelFileName, "\")
  if LPosition = 0 Then 'no folder path
    strExcelFileName = strScriptPath & "\" & strExcelFileName
    strScriptPath = strScriptPath & "\"
  else 'there is a folder path, use it for the output folder path also
    strScriptPath = Mid(strExcelFileName, 1, LPosition)
  End If
  ' msgbox LPosition & " - " & strExcelFileName & " - " & strScriptPath
person George Birbilis    schedule 08.09.2018

Измените WSH DropHandler ({60254CA5-953B-11CF-8C96-00AA00B8708C}) на {86C86720-42A0-1069-A2E8-08002B30309D} и добавьте эту функцию для преобразования короткого пути в длинный:

Function Short2Long(shortFullPath)
    dim fs
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set f = fs.GetFile(shortFullPath)
    Set app = CreateObject("Shell.Application")
    Short2Long = app.NameSpace(f.ParentFolder.Path).ParseName(f.Name).Path
end function
person Kardof Zilaf    schedule 15.01.2020