从子程序获取批处理文件名

3
在子程序中,%0会展开为子程序名称,而不是脚本名称。是否有合法的方法仍然可以访问脚本名称,还是应该将其作为参数传递?
@echo off

call :subroutine %~f0 my parameters
exit /b

:subroutine
shift
echo Script name is %0
echo Parameters: %1 %2
exit /b

我希望“调用语句”只需这样

call :subroutine my parameters
3个回答

4
在函数中,您需要至少添加一个修饰符到%~0
call :test
exit /b

:test
echo 0   %0    - shows "test"
echo ~0  %~0   - shows "test"
echo ~f0 %~f0  - shows the batch name (full path)
exit /b

谢谢。我在阅读https://dev59.com/9m3Xa4cB1Zd3GeqPiL-c后已经注意到这一点了。 - utapyngo

2
我相信 %~nx0 会给你带有扩展名的文件名,而 %~n0 则只会给你文件名...

1
我更喜欢在我的脚本顶部使用这个:
set "This=%~dpnx0"

这样你仍然可以保留当前运行脚本的完整路径。如果只需要获取脚本名称,可以使用 FOR /F 循环来提取它:
set "This=%~dpnx0"
echo This=%This%
for /F %%I in ('echo.%This%') do set "Name=%%~nxI"
echo Name=!Name!

我曾经认为全局变量是不好的。但现在看来情况并非如此。 - utapyngo
@utapyngo:基本上是这样,但由于在Windows批处理脚本中没有定义常量值的方法,我认为这是可以接受的例外。 :) - Andreas
1
好吧,我想你可以在开头只做 set "Name=%~nx0"。 :) 至少,你的循环似乎有点过度,你可以有一个更简单的循环:for %%I in ("%This%") do set "Name=%%~nxI" - Andriy M

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