Batch Extract path and filename from a variable

前端 未结 5 1549
故里飘歌
故里飘歌 2020-11-27 11:18

How can I extract path and filename from a variable?

Setlocal EnableDelayedExpansion
set file=C:\\Users\\l72rugschiri\\Desktop\\fs.cfg

I wa

相关标签:
5条回答
  • 2020-11-27 11:54

    All of this works for me:

    @Echo Off
    Echo Directory = %~dp0
    Echo Object Name With Quotations=%0
    Echo Object Name Without Quotes=%~0
    Echo Bat File Drive = %~d0
    Echo Full File Name = %~n0%~x0
    Echo File Name Without Extension = %~n0
    Echo File Extension = %~x0
    Pause>Nul
    

    Output:

    Directory = D:\Users\Thejordster135\Desktop\Code\BAT\
    
    Object Name With Quotations="D:\Users\Thejordster135\Desktop\Code\BAT\Path_V2.bat"
    
    Object Name Without Quotes=D:\Users\Thejordster135\Desktop\Code\BAT\Path_V2.bat
    
    Bat File Drive = D:
    
    Full File Name = Path.bat
    
    File Name Without Extension = Path
    
    File Extension = .bat
    
    0 讨论(0)
  • 2020-11-27 12:03

    You can only extract path and filename from (1) a parameter of the BAT itself %1, or (2) the parameter of a CALL %1 or (3) a local FOR variable %%a.


    in HELP CALL or HELP FOR you may find more detailed information:

    %~1 - expands %1 removing any surrounding quotes (")
    %~f1 - expands %1 to a fully qualified path name
    %~d1 - expands %1 to a drive letter only
    %~p1 - expands %1 to a path only
    %~n1 - expands %1 to a file name only
    %~x1 - expands %1 to a file extension only
    %~s1 - expanded path contains short names only
    %~a1 - expands %1 to file attributes
    %~t1 - expands %1 to date/time of file
    %~z1 - expands %1 to size of file


    And then try the following:

    Either pass the string to be parsed as a parameter to a CALL

    call :setfile ..\Desktop\fs.cfg
    echo %file% = %filepath% + %filename%
    goto :eof
    
    :setfile
    set file=%~f1
    set filepath=%~dp1
    set filename=%~nx1
    goto :eof
    

    or the equivalent, pass the filename as a local FOR variable

    for %%a in (..\Desktop\fs.cfg) do (
        set file=%%~fa
        set filepath=%%~dpa
        set filename=%%~nxa
    )    
    echo %file% = %filepath% + %filename%
    
    0 讨论(0)
  • 2020-11-27 12:07

    Late answer, I know, but for me the following script is quite useful - and it answers the question too, hitting two flys with one flag ;-)

    The following script expands SendTo in the file explorer's context menu:

    @echo off
    cls
    if "%~dp1"=="" goto Install
    
    REM change drive, then cd to path given and run shell there
    %~d1
    cd "%~dp1"
    cmd /k
    goto End
    
    :Install
    rem No arguments: Copies itself into SendTo folder
    copy "%0" "%appdata%\Microsoft\Windows\SendTo\A - Open in CMD shell.cmd"
    
    :End
    

    If you run this script without any parameters by double-clicking on it, it will copy itself to the SendTo folder and renaming it to "A - Open in CMD shell.cmd". Afterwards it is available in the "SentTo" context menu.

    Then, right-click on any file or folder in Windows explorer and select "SendTo > A - Open in CMD shell.cmd"

    The script will change drive and path to the path containing the file or folder you have selected and open a command shell with that path - useful for Visual Studio Code, because then you can just type "code ." to run it in the context of your project.

    How does it work?

    %0 - full path of the batch script
    %~d1 - the drive contained in the first argument (e.g. "C:")
    %~dp1 - the path contained in the first argument
    cmd /k - opens a command shell which stays open

    Not used here, but %~n1 is the file name of the first argument.

    I hope this is helpful for someone.

    0 讨论(0)
  • 2020-11-27 12:10

    if you want infos from the actual running batchfile, try this :

    @echo off
    set myNameFull=%0
    echo myNameFull     %myNameFull%
    set myNameShort=%~n0
    echo myNameShort    %myNameShort%
    set myNameLong=%~nx0
    echo myNameLong     %myNameLong%
    set myPath=%~dp0
    echo myPath         %myPath%
    set myLogfileWpath=%myPath%%myNameShort%.log
    echo myLogfileWpath %myLogfileWpath%
    

    more samples? C:> HELP CALL

    %0 = parameter 0 = batchfile %1 = parameter 1 - 1st par. passed to batchfile... so you can try that stuff (e.g. "~dp") between 1st (e.g. "%") and last (e.g. "1") also for parameters

    0 讨论(0)
  • 2020-11-27 12:17
    @ECHO OFF
    SETLOCAL
    set file=C:\Users\l72rugschiri\Desktop\fs.cfg
    FOR %%i IN ("%file%") DO (
    ECHO filedrive=%%~di
    ECHO filepath=%%~pi
    ECHO filename=%%~ni
    ECHO fileextension=%%~xi
    )
    

    Not really sure what you mean by no "function"

    Obviously, change ECHO to SET to set the variables rather thon ECHOing them...

    See for documentation for a full list.


    ceztko's test case (for reference)

    @ECHO OFF
    SETLOCAL
    set file="C:\Users\ l72rugschiri\Desktop\fs.cfg"
    FOR /F "delims=" %%i IN ("%file%") DO (
    ECHO filedrive=%%~di
    ECHO filepath=%%~pi
    ECHO filename=%%~ni
    ECHO fileextension=%%~xi
    )
    

    Comment : please see comments.

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