Unicode named Folder shows ? in wscript prompt

喜你入骨 提交于 2021-02-07 19:25:23

问题


I am facing problems with Unicode named folders. When I drag the folder to the script, it doesn't show the path of the folder properly.

Simple VBScript (this is just a portion of it):

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

If it is a normal path without Unicode characters, it's fine. But in this case: Directory: 4minute (포미닛) - Hit Your Heart

Then it will show something like 4minute (?) - Hit Your Heart

And if I do a FolderExists it can't find the dragged folder.

Is there any workaround to support Unicode named Folders?

Thanks!

I'll edit if this is not clear enough


回答1:


This does seem to be a problem peculiar to the Windows Script Host's DropHandler shell extension. Whereas:

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

both work when typed from the console (even if the console can't render the Hangul so it looks like ?), a drag and drop operation that should result in the same command goes through a Unicode->ANSI->Unicode translation that loses all characters that aren't in the current ANSI code page. (So 포미닛 will work on a default Korean Windows install but not Western.)

I'm not aware of a proper way to fix the problem. You could perhaps work around it by changing the DropHandler for .vbs files in the registry:

HKEY_CLASSES_ROOT\VBSFile\ShellEx\DropHandler\(Default)

from the WSH DropHandler ({60254CA5-953B-11CF-8C96-00AA00B8708C}) to {86C86720-42A0-1069-A2E8-08002B30309D}, the one used for .exe, .bat and similar, which doesn't suffer from this issue. You would also probably have to change the file association for .vbs to put quotes around the filename argument too, since the EXE DropHandler doesn't, to avoid problems with spaces in filenames.

Since this affects argument-passing for all VBS files it would be a perilous fix to deploy on any machine but your own. If you needed to do that, maybe you could try creating a new file extension with the appropriate DropTarget rather than changing VBSFile itself? Or maybe forgo drop-onto-script behaviour and provide a file Open dialog or manual drop field instead.




回答2:


For anyone landing here from Google...

Bobince's tip lead me to work around this problem by wrapping my vbscript file (myscript.vbs) in a dos batch file (mybatch.bat).

The tip was:

"Seem to be a problem peculiar to the Windows Script Host's DropHandler shell extension whereas.... the one used for .exe, .bat and similar... doesn't suffer from this issue."

mybatch.bat contains:

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

You may also find this code from my myscript.vbs to be helpful

For Each strFullFileName In Wscript.Arguments
  ' do stuff
Next



回答3:


Based on DG's answer, if you just want to accept one file as drop target then you can write a batch file (if you have it named as "x.bat" place VBScript with filename "x.bat.vbs" at same folder) that just contains:

@"%0.vbs" %1

the @ means to not output the row on the display (I found it to show garbage text even if you use chcp 1250 as first command)

don't use double-quotes around %1, it won't work if your VBScript uses logic like the following (code I was using below was from http://jeffkinzer.blogspot.com/2012/06/vbscript-to-convert-excel-to-csv.html). Tested it and it works fine with spaces in the file and folder names:

  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



回答4:


Modify WSH DropHandler ({60254CA5-953B-11CF-8C96-00AA00B8708C}) to {86C86720-42A0-1069-A2E8-08002B30309D} and add this function to convert short path to long:

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


来源:https://stackoverflow.com/questions/4365939/unicode-named-folder-shows-in-wscript-prompt

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!