代码之家  ›  专栏  ›  技术社区  ›  Alexander Bird

完整环境变量的Windows命令行波浪号运算符?

  •  2
  • Alexander Bird  · 技术社区  · 12 年前

    在cmd中,您可以使用波浪号“operator”对传入的参数执行一些很酷的操作。例如,%~dp0返回当前脚本的路径名。

    你能为任何环境变量做到这一点吗?例如:

     set foo=1234.exe
     echo %~nfoo%
    

    有办法做到这一点吗?

    2 回复  |  直到 8 年前
        1
  •  2
  •   josh poley    12 年前

    您也可以通过 for 循环而不是子程序:

    setlocal
    set foo=1234.exe
    for %%I in ("%foo%") do echo %%~nI
    
        2
  •  1
  •   james    12 年前

    是的,有点。

    在下面的文件(我命名为test1.cmd)中,有一个将文件路径和名称传递给同一.cmd文件中的子例程并返回驱动器号和路径的示例。通过在子程序的最后一行设置更多的环境变量,您可以返回更多的驱动器号、路径、文件名、属性等的组合。

    最后一行是重要的部分。Windows命令处理器一次计算一行,因此该行首先将环境变量扩展为其文本值,然后再处理该行。该扩展行破坏子例程的作用域,返回到外部作用域(endlocal),将一个新变量(mytest2)设置为子例程(扩展的)%dp1的值,然后执行goto:eof,返回到调用行。

    
    setlocal
    
    set mytest=c:\windows\a file with spaces in name.txt
    
    call :mytest2 "%mytest%"
    
    echo %mytest2%
    
    :ender
    endlocal
    
    goto :eof
    
    :mytest2
    setlocal
    echo %~dp1
    
    endlocal && set mytest2=%~dp1 && goto :eof