What does %~dp0 mean, and how does it work?

后端 未结 7 1996

I find %~dp0 very useful, and I use it a lot to make my batch files more portable.

But the label itself seems very cryptic to me... What is the ~<

相关标签:
7条回答
  • 2020-11-22 02:39

    Great example from Strawberry Perl's portable shell launcher:

    set drive=%~dp0
    set drivep=%drive%
    if #%drive:~-1%# == #\# set drivep=%drive:~0,-1%
    
    set PATH=%drivep%\perl\site\bin;%drivep%\perl\bin;%drivep%\c\bin;%PATH%
    

    not sure what the negative 1's doing there myself, but it works a treat!

    0 讨论(0)
  • 2020-11-22 02:46

    Calling

    for /?
    

    in the command-line gives help about this syntax (which can be used outside FOR, too, this is just the place where help can be found).

    In addition, substitution of FOR variable references has been enhanced. You can now use the following optional syntax:

    %~I         - expands %I removing any surrounding quotes (")
    %~fI        - expands %I to a fully qualified path name
    %~dI        - expands %I to a drive letter only
    %~pI        - expands %I to a path only
    %~nI        - expands %I to a file name only
    %~xI        - expands %I to a file extension only
    %~sI        - expanded path contains short names only
    %~aI        - expands %I to file attributes of file
    %~tI        - expands %I to date/time of file
    %~zI        - expands %I to size of file
    %~$PATH:I   - searches the directories listed in the PATH
                   environment variable and expands %I to the
                   fully qualified name of the first one found.
                   If the environment variable name is not
                   defined or the file is not found by the
                   search, then this modifier expands to the
                   empty string
    

    The modifiers can be combined to get compound results:

    %~dpI       - expands %I to a drive letter and path only
    %~nxI       - expands %I to a file name and extension only
    %~fsI       - expands %I to a full path name with short names only
    %~dp$PATH:I - searches the directories listed in the PATH
                   environment variable for %I and expands to the
                   drive letter and path of the first one found.
    %~ftzaI     - expands %I to a DIR like output line
    

    In the above examples %I and PATH can be replaced by other valid values. The %~ syntax is terminated by a valid FOR variable name. Picking upper case variable names like %I makes it more readable and avoids confusion with the modifiers, which are not case sensitive.

    There are different letters you can use like f for "full path name", d for drive letter, p for path, and they can be combined. %~ is the beginning for each of those sequences and a number I denotes it works on the parameter %I (where %0 is the complete name of the batch file, just like you assumed).

    0 讨论(0)
  • 2020-11-22 02:53

    %~dp0 expands to current directory path of the running batch file.

    To get clear understanding, let's create a batch file in a directory.

    C:\script\test.bat

    with contents:

    @echo off
    echo %~dp0
    

    When you run it from command prompt, you will see this result:

    C:\script\

    0 讨论(0)
  • 2020-11-22 02:54

    The variable %0 in a batch script is set to the name of the executing batch file.

    The ~dp special syntax between the % and the 0 basically says to expand the variable %0 to show the drive letter and path, which gives you the current directory containing the batch file!

    Help = Link

    0 讨论(0)
  • 2020-11-22 02:56

    Another tip that would help a lot is that to set the current directory to a different drive one would have to use %~d0 first, then cd %~dp0. This will change the directory to the batch file's drive, then change to its folder.

    Alternatively, for #oneLinerLovers, as @Omni pointed out in the comments cd /d %~dp0 will change both the drive and directory :)

    Hope this helps someone.

    0 讨论(0)
  • 2020-11-22 03:03

    An example would be nice - here's a trivial one

    for %I in (*.*) do @echo %~xI
    

    it lists only the EXTENSIONS of each file in current folder

    for more useful variable combinations (also listed in previous response) from the CMD prompt execute: HELP FOR which contains this snippet

    The modifiers can be combined to get compound results:

    %~dpI       - expands %I to a drive letter and path only
    %~nxI       - expands %I to a file name and extension only
    %~fsI       - expands %I to a full path name with short names only
    %~dp$PATH:I - searches the directories listed in the PATH
                   environment variable for %I and expands to the
                   drive letter and path of the first one found.
    %~ftzaI     - expands %I to a DIR like output line
    
    0 讨论(0)
提交回复
热议问题