【问题标题】:Get batch file name from a subroutine从子例程中获取批处理文件名
【发布时间】:2013-02-10 07:17:40
【问题描述】:

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

【问题讨论】:

    标签: batch-file cmd subroutine


    【解决方案1】:

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

    【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      我更喜欢在我的脚本顶部使用它:

      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:这基本上是正确的,但由于无法在 Windows 批处理脚本中定义常量值,我认为这是一个可以接受的例外。 :)
      • 好吧,我想你可以在开头做set "Name=%~nx0"。 :) 至少,你的循环似乎有点矫枉过正,你可以有一个更简单的:for %%I in ("%This%") do set "Name=%%~nxI"
      猜你喜欢
      • 2012-03-11
      • 1970-01-01
      • 1970-01-01
      • 2011-06-15
      • 1970-01-01
      • 2013-07-16
      • 1970-01-01
      • 1970-01-01
      • 2011-01-12
      相关资源
      最近更新 更多