Юникод с именем Папка показывает? в командной строке wscript - PullRequest
4 голосов
/ 06 декабря 2010

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

Простой 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

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

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

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

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

Спасибо!

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

Ответы [ 3 ]

4 голосов
/ 06 декабря 2010

Это, похоже, проблема, свойственная расширению оболочки DropHandler Windows Script Host . Принимая во внимание:

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

оба работают при вводе с консоли (даже если консоль не может отобразить Hangul, поэтому он выглядит как ?), операция перетаскивания, которая должна приводить к одной и той же команде, проходит через 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? Или, может быть, отказаться от поведения перетаскивания в сценарий и вместо этого предоставить диалоговое окно открытия файла или поле ручного удаления.

2 голосов
/ 27 ноября 2012

Для любого, кто приземлится здесь из Google ...

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

Совет был:

"Кажется, это проблема, присущая Windows Script Host Расширение оболочки DropHandler, тогда как .... используемое для .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
0 голосов
/ 08 сентября 2018

Исходя из ответа 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
...