在我的批处理脚本中,我调用另一个脚本并传递一个字符串参数。
cscript log.vbs "triggered from folder <foldername> by Eric"
如您所见,字符串参数包含了调用脚本的文件夹名称。正确的方法是如何动态地将此文件夹名称插入到脚本中?
cscript log.vbs "triggered from folder <foldername> by Eric"
如您所见,字符串参数包含了调用脚本的文件夹名称。正确的方法是如何动态地将此文件夹名称插入到脚本中?
%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"
%~dp0
很有用。 - Isaac
endlocal
后就无法再访问folder
变量了,所以我把那一行给删掉了。我想既然我删除了那一行,我也应该把顶部的@setlocal enableextensions enabledelayedexpansion
给删掉,但是删除那一行会导致问题,所以我还是保留了它。 - Bermingendlocal
,它会在后面影响到你。你仍然可以使用setlocal/endlocal
来确保延迟扩展工作,但是修改endlocal
为endlocal && set folder=%folder%
,这样folder
变量就会被转义。 - paxdiablo