1

Тема: VBScript: получение длинного имени файла/папки по короткому имени

Способ получения короткого имени объекта файловой системы [как правило, полного пути — обычно требуется именно полный путь, а не только имя] по имеющемуся обычному, длинному имени наличествует в Windows Script Host изначально в объекте Scripting.FileSystemObject.

Для папки:
* короткое имя — метод .ShortName;
* полный путь — метод .ShortPath.

Для файла аналогично:
* короткое имя — метод .ShortName;
* полный путь — метод .ShortPath.


Обратный же процесс — получение длинного имени объекта файловой системы по имеющемуся короткому имени в Windows Script Host, к сожалению, отсутствует. Предлагается следующий способ определения длинного имени посредством Проводника:

Option Explicit

Dim objShell
Dim objFolder
Dim objFolderItem

' C:\PROGRA~1\WINDOW~1\ACCESS~1\wordpad.exe
' C:\Program Files\Windows NT\Accessories\wordpad.exe

Set objShell  = WScript.CreateObject("Shell.Application")
Set objFolder = objShell.Namespace("C:\PROGRA~1\WINDOW~1\ACCESS~1")

If Not objFolder Is Nothing Then
    ' Длинное имя [полный путь] папки
    WScript.Echo objFolder.Self.Path
    
    Set objFolderItem = objFolder.ParseName("wordpad.exe")
    
    If Not objFolderItem Is Nothing Then
        ' Длинное имя [полный путь] файла
        WScript.Echo objFolderItem.Path
        
        Set objFolderItem = Nothing
    End If
    
    Set objFolder = Nothing
End If

Set objShell  = Nothing

WScript.Quit 0

Автор идеи — kefi.

2

Re: VBScript: получение длинного имени файла/папки по короткому имени

Получение длинного имени на основе короткого можно оформить функцией (на основе изложенного выше):

Option Explicit

WScript.Echo GetLongPath("C:\PROGRA~1\WINDOW~1\ACCESS~1")
WScript.Echo GetLongPath("C:\PROGRA~1\WINDOW~1\ACCESS~1\wordpad.exe")

' Пример с ошибкой в имени (раскомментировать)
' WScript.Echo GetLongPath("C:\PROGRA~1\WINDOW~1\ACCESS~1\wodpad.exe")

WScript.Quit 0
'=============================================================================

'=============================================================================
Function GetLongPath(strShortPath)
    Dim strShortFolder
    Dim strShortFile
    
    Dim boolIsFolder
    
    Dim objShell
    Dim objFolder
    Dim objFolderItem
    
    With WScript.CreateObject("Scripting.FileSystemObject")
        If .FolderExists(strShortPath) Then
            boolIsFolder   = True
            
            strShortFolder = strShortPath
        Else
            If .FileExists(strShortPath) Then
                boolIsFolder   = False
                
                strShortFolder = .GetFile(strShortPath).ParentFolder
                strShortFile   = .GetFile(strShortPath).Name
            Else
                Err.Raise &H800A0035, WScript.ScriptFullName & "::GetLongPath(strShortPath)" , "File or folder [" & strShortPath & "] not found"
            End If
        End If
    End With
    
    Set objShell  = WScript.CreateObject("Shell.Application")
    Set objFolder = objShell.Namespace(strShortFolder)
    
    If Not objFolder Is Nothing Then
        If boolIsFolder Then
            GetLongPath = objFolder.Self.Path
        Else
            Set objFolderItem = objFolder.ParseName(strShortFile)
            
            If Not objFolderItem Is Nothing Then
                GetLongPath = objFolderItem.Path
                
                Set objFolderItem = Nothing
            End If
        End If
        
        Set objFolder = Nothing
    End If
    
    Set objShell  = Nothing
End Function
'=============================================================================