Get full path and long file name from short file name

前端 未结 10 753
故里飘歌
故里飘歌 2020-12-15 09:13

I have an nice console file manager (eXtreme by Senh Liu), it passes short path/filenames as variables to a menu.bat.

How can I generate a full folder name + long fi

相关标签:
10条回答
  • 2020-12-15 09:33
    @echo off
    setlocal
    rem this need to be a short name to avoid collisions with dir command bellow
    cd C:\BALBAL~1\BLBALB~1\
    set "curr_dir=%cd%"
    set "full_path="
    
    :repeat
    
    for /f "delims=" %%f in ('for %%d in ^(.^) do @dir  /a:d /n /b "..\*%%~snd"') do ( 
        set "full_path=%%f\%full_path%"
    )
    
    cd ..
    
    if ":\" NEQ "%cd:~-2%" (
        goto :repeat
    ) else (
        set "full_path=%cd%%full_path%"
    )
    
    echo --%full_path%--
    cd %curr_dir%
    endlocal
    

    The path is hardcoded at the beginning but you can change it or parameterizied it.As you can easy get the full name of a file here is only a solution for directories.

    EDIT

    now works for file and directory and a parameter can be passed:

       @echo off
    
    rem ---------------------------------------------
    rem ---------------------- TESTS ----------------
    rem ----------------------------------------------
    
    md "c:\test\blablablablabl\bla bla bla\no no no no no no\yes yes yes" >nul 2>&1
    md "c:\test\1                      b1\1\" >nul 2>&1
    for %%t in ("c:\test\blablablablabl\bla bla bla\no no no no no no\yes yes yes") do set t_dir=%%~st
    for %%t in ("c:\test\1                      b1\1\") do set t_dir2=%%~st
    echo a>"%t_dir2%a"
    echo a>"%t_dir2%a a.txt"
    
    echo testing "%t_dir%\\"
    call :get_full_name "%t_dir%\\"
    echo(
    echo testing "%t_dir2%a"
    call :get_full_name "%t_dir2%a"
    echo(
    echo testing "%t_dir2%a a.txt" with return variable
    call :get_full_name  "%t_dir2%a a.txt" test_var
    echo  return variable : -- %test_var% --
    goto :eof
    
    rem -------------------------------------
    
    :get_full_name [%1 - short path to a file or directory ; %2 - if set stores the result in variable with that name] 
    setlocal
    if not exist "%~1" ( echo file/dir does not exist & exit /b 2 )
    
    set "curr_dir=%cd%"
    for /f "delims=" %%n  in ('dir /b /n "%~dps1\%~snx1"') do set "name=%%n"
    
    cd "%~dps1"
    set "full_path="
    :repeat
    for /f "delims=" %%f in ('for %%d in ^(.^) do @dir  /a:d /n /b "..\*%%~snd"') do ( 
        set "full_path=%%~f\%full_path%"
    )
    cd ..
    if ":\" NEQ "%cd:~-2%" (
        goto :repeat
    ) else (
        set "full_path=%cd%%full_path%"
    )
    
    echo %full_path%%name%
    cd %curr_dir%
    endlocal & if "%~2" NEQ ""  set "%~2=%full_path%%name%"
    

    and the test output:

    testing "c:\test\BLABLA~1\BLABLA~1\NONONO~1\YESYES~1\\"
    c:\test\blablablablabl\bla bla bla\no no no no no no\yes yes yes\
    
    testing "c:\test\1B1~1\1\a"
    c:\test\1                      b1\1\a
    
    testing "c:\test\1B1~1\1\a a.txt" with return variable
    c:\test\1                      b1\1\a a.txt
     return variable : -- c:\test\1                      b1\1\a a.txt --
    
    0 讨论(0)
  • 2020-12-15 09:33

    My solution:

    set shortname=P:\MYPROG~1\SHELLS\ZBACKUP\REFSTO~1.BAL
    for /F %f in ('dir /b /s %shortname%') do where /R %~dpf %~nf%~xf
    

    if you use it in a batch file:

    for /F %%f in ('dir /b /s %shortname%') do where /R %%~dpf %%~nf%%~xf
    
    0 讨论(0)
  • 2020-12-15 09:46

    Simple solution: use PowerShell.

    PS C:\> (Get-Item 'P:\MYPROG~1\SHELLS\ZBACKUP\REFSTO~1.BAL').FullName
    P:\MyPrograms\SHELLS\zBackup\RefsToMyData.bal

    You can incorporate a PowerShell call in a batch file like this:

    @echo off
    
    setlocal
    
    for /f "usebackq delims=" %%f in (
      `powershell.exe -Command "(Get-Item '%~1').FullName"`
    ) do @set "var=%%~f"
    
    echo %var%
    

    Output:

    C:\> test.cmd P:\MYPROG~1\SHELLS\ZBACKUP\REFSTO~1.BAL
    P:\MyPrograms\SHELLS\zBackup\RefsToMyData.bal

    PowerShell is available for all supported Windows versions:

    • Windows XP SP3 and Server 2003 SP2: PowerShell v2 available
    • Windows Vista and Server 2008: ship with PowerShell v1 (not installed by default), PowerShell v2 available
    • Windows 7 and Server 2008 R2: PowerShell v2 preinstalled, PowerShell v3 available (batteries not included)
    • Windows 8 and Server 2012: PowerShell v3 preinstalled

    If PowerShell can't be used for some reason (e.g. administrative restrictions), I'd use VBScript instead:

    name = WScript.Arguments(0)
    
    Set fso = CreateObject("Scripting.FileSystemObject")
    If fso.FileExists(name) Then
      Set f = fso.GetFile(name)
    ElseIf fso.FolderExists(name) Then
      Set f = fso.GetFolder(name)
      If f.IsRootFolder Then
        WScript.Echo f.Path
        WScript.Quit 0
      End If
    Else
      'path doesn't exist
      WScript.Quit 1
    End If
    
    Set app = CreateObject("Shell.Application")
    WScript.Echo app.NameSpace(f.ParentFolder.Path).ParseName(f.Name).Path
    

    A VBScript like the one above can be used in a batch file like this:

    @echo off & setlocal
    
    for /f "delims=" %%f in ('cscript //NoLogo script.vbs "%~1"') do @set "var=%%~f"
    
    echo %var%
    

    This does require an additional script file, though.

    0 讨论(0)
  • 2020-12-15 09:47

    This returns the full long pathname, but depends on:
    A) there not being too many files in the tree (due to time taken)
    B) there is only one of the target (long) filename in the tree.

    @echo off
    for /f "delims=" %%a in (' dir /b "%~1" ') do set "file=%%a"
    for /f "delims=~" %%a in ("%~dp1") do cd /d "%%a*"
    for /f "delims=" %%a in ('dir /b /s /a-d "%file%" ') do set "var=%%a"
    echo "%var%"
    

    When called with mybat "d:\MYPROG~1\SHELLS\zBackup\REFSTO~1.BAL"
    it returned this:

    "d:\MyPrograms\SHELLS\zBackup\RefsToMyData.bal"

    0 讨论(0)
提交回复
热议问题