Batch file 从子例程获取批处理文件名

Batch file 从子例程获取批处理文件名,batch-file,cmd,subroutine,Batch File,Cmd,Subroutine,在子例程中,%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 我相信%%nx0会给你带扩展名的文件

在子例程中,%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

我相信%%nx0会给你带扩展名的文件名,%n0只会给你文件名

我更喜欢在脚本顶部使用此选项:

set "This=%~dpnx0"
这样,您仍然可以保留当前正在运行的脚本的完整路径。如果需要只获取脚本的名称,可以使用FOR/F循环来提取它:

set "This=%~dpnx0"
echo This=%This%
for /F %%I in ('echo.%This%') do set "Name=%%~nxI"
echo Name=!Name!

在函数中,您需要至少向
%~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

我过去认为全局变量是不好的。但看起来情况并非如此。@utapyngo:基本上是这样,但由于无法在Windows批处理脚本中定义常量值,我认为这是一个可以接受的例外情况。:)嗯,我想你可以在开始时设置“Name=%~nx0”。)至少,您的循环似乎有点过头了,您可以使用一个更简单的循环:
对于%%I in(“%This%”)设置“Name=%%~nxI”
。谢谢。我在阅读后已经注意到了这一点。