.bat当前文件夹名称

7
在我的批处理脚本中,我调用另一个脚本并传递一个字符串参数。
cscript log.vbs "triggered from folder <foldername> by Eric"

如您所见,字符串参数包含了调用脚本的文件夹名称。正确的方法是如何动态地将此文件夹名称插入到脚本中?

2个回答

22
如果你想要获取当前所在的目录,可以使用%cd%命令。这就是你的当前工作目录。
如果在脚本执行期间需要更改当前工作目录,请在开始时保存它。
set startdir=%cd%
然后您可以在代码中使用%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"

对于这种情况并不是问题,但是如果你正在处理一个可能以\结尾的路径变量,则可以通过追加\.来保证正确的结果。

for %%F in ("%pathVar%\.") do set "folder=%~nxF"

1
@Berming,我已经添加了代码,可以获取路径的最后一个组成部分。请查看更新。 - paxdiablo
正是我所需要的,非常感谢。不过我注意到当我使用 endlocal 后就无法再访问 folder 变量了,所以我把那一行给删掉了。我想既然我删除了那一行,我也应该把顶部的 @setlocal enableextensions enabledelayedexpansion 给删掉,但是删除那一行会导致问题,所以我还是保留了它。 - Berming
2
@Berming,看一下更新。如果你省略了 endlocal,它会在后面影响到你。你仍然可以使用 setlocal/endlocal 来确保延迟扩展工作,但是修改 endlocalendlocal && set folder=%folder%,这样 folder 变量就会被转义。 - paxdiablo
学习编程的时候,我吃了亏,发现@setlocal enableextensions enabledelayedexpansion真的是必须的。 - Jan

9

1
这将提供批处理脚本存储的文件夹,这可能与调用脚本的位置相同也可能不同,所以在我的情况下它无法正常工作,因为几乎总是从不同的位置调用脚本,这个位置与脚本实际存储的位置不同。 - Berming
2
好的!抱歉。没问题,我会将这个答案留在这里作为参考 - 某些情况下,有人可能会发现 %~dp0 很有用。 - Isaac

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接