2010-10-03 98 views
6

在我的蝙蝠剧本,我调用另一个脚本,并传递一个字符串参数.BAT当前文件夹的名称

cscript log.vbs "triggered from folder <foldername> by Eric" 

的字符串参数,你可以看到包含该脚本是文件夹的名称被称为。什么是正确的方式来通过这动态插入这个文件夹名称的脚本?

回答

18

如果你想你在哪里目前是目录,你可以从%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 2010-10-03 08:28:19

+0

正是我所需要的,非常感谢。我注意到,虽然我'endlocal'后我不能访问'文件夹'变量,所以我拿出了那一行。我想,因为我删除了该行,我还应该删除顶部的@setlocal enableextensions enabledelayedexpansion',但删除该行会导致问题,所以我保留了那一行。 – Berming 2010-10-03 11:25:17

+2

@Berming,看到更新。如果你离开'endlocal',它会影响你以后。你可以使用'setlocal/endlocal'来确保延迟扩展能够正常工作,但是将'endlocal'修改为'endlocal && set folder =%folder%',以便'folder'变量能够转义。 – paxdiablo 2010-10-04 03:42:50

8
+1

保证正确的结果这给出了蝙蝠脚本存储的文件夹,可能与脚本被调用的地方不一样,所以它不适用于我的情况,因为它几乎总是从不同的位置调用从脚本实际存储的位置开始。 – Berming 2010-10-03 04:47:26

+1

对!抱歉。好的,我将这里的答案留作参考 - 有人可能会发现'%〜dp0'对某些目的有用。 – Isaac 2013-04-01 06:21:00

相关问题