.bat当前文件夹名称

Ber*_*ing 6 windows batch-file

在我的bat脚本中,我正在调用另一个脚本并传递一个字符串参数

cscript log.vbs "triggered from folder <foldername> by Eric"
Run Code Online (Sandbox Code Playgroud)

您可以看到的字符串参数包含从中调用脚本的文件夹的名称.传递此动态的正确方法是将此文件夹名称动态插入脚本?

pax*_*blo 20

如果你想要你目前所在的目录,你可以从中获得%cd%.那是你当前的工作目录.

如果您要在脚本执行期间更改当前工作目录,请将其保存在开头:

set startdir=%cd%
Run Code Online (Sandbox Code Playgroud)

然后,您可以%startdir%在代码中使用,无论以后是否有任何更改(影响%cd%).


如果您只想获取该路径的最后一个组件(根据您的注释),您可以使用以下作为基线:

    @setlocal enableextensions enabledelayedexpansion
    @echo off
    set startdir=%cd%
    set temp=%startdir%
    set folder=
:loop
    if not "x%temp:~-1%"=="x\" (
        set folder=!temp:~-1!!folder!
        set temp=!temp:~0,-1!
        goto :loop
    )
    echo.startdir = %startdir%
    echo.folder   = %folder%
    endlocal && set folder=%folder%

这输出:

    C:\Documents and Settings\Pax> testprog.cmd
    startdir = C:\Documents and Settings\Pax
    folder   = Pax

它的工作原理是从完整路径的末尾复制字符,一次一个,直到找到\分隔符.它既不漂亮也不高效,但Windows批量编程很少是:-)

编辑

实际上,有一种简单而有效的方法来获取最后一个组件名称.

for %%F in ("%cd%") do set "folder=%~nxF"
Run Code Online (Sandbox Code Playgroud)

对于这种情况不是问题,但是如果您正在处理包含可能结束或不结束的路径的变量\,那么您可以通过附加来保证正确的结果\.

for %%F in ("%pathVar%\.") do set "folder=%~nxF"
Run Code Online (Sandbox Code Playgroud)

  • @Berming,看看更新.如果你离开`endlocal`,它会在以后影响你.您可以_still_使用`setlocal/endlocal`来确保延迟扩展有效,但将`endlocal`修改为`endlocal && set folder =%folder%`,以便`folder`变量转义. (2认同)

Isa*_*aac 9

试试%~dp0.

这里:http://weblogs.asp.net/whaggard/archive/2005/01/28/get-directory-path-of-an-executing-batch-file.aspx

  • 对!对不起。好的,我将这个答案留在这里作为参考 - 有人可能会发现 `%~dp0` 对某些目的很有用。 (2认同)