代码之家  ›  专栏  ›  技术社区  ›  paxdiablo

在命令提示符,如何让一个变量转义setlocal命令?

  •  8
  • paxdiablo  · 技术社区  · 14 年前

    setlocal 在内部 cmd.exe

    考虑下面的代码,它给出了当前目录的最后一个组件(因此 c:\pax\dir1 会给你 dir1 ):

            @echo off
        :main
            setlocal enableextensions enabledelayedexpansion
            call :func
            echo.main_folder = %folder%
            endlocal
            goto :eof
    
        :func
            setlocal enableextensions enabledelayedexpansion
            set temp=%cd%
            set folder=
        :funcloop1
            if not "x%temp:~-1%"=="x\" (
                set folder=!temp:~-1!!folder!
                set temp=!temp:~1,-1!
                goto :funcloop1
            )
            echo.func_folder = %folder%
            endlocal
            goto :eof
    

    当我运行这个时,我得到的输出是:

    func_folder = dir1
    main_folder =
    

    %folder% 变量在 endlocal . 但是,如果我离开 setlocal/endlocal 从函数中 temp varaible污染的命名空间 main

    我知道我可以用 set temp= 在结束时 func 这将删除环境变量,但这不包括我已经在外部范围内使用该变量的情况(在这种情况下,它将被完全销毁)。

    有办法进去吗


    除此之外,请不要告诉我还有更好的方法来获得最终路径组件。这只是一个例子。

    实际上,你

    3 回复  |  直到 14 年前
        1
  •  10
  •   Robert Groves    14 年前

    “解决方法是利用CMD shell逐行计算变量这一事实,因此,将ENDLOCAL与SET语句放在同一行上可以得到我们想要的结果:“source: ss64.com

    endlocal & set folder=%folder%
    

        2
  •  3
  •   jeb    14 年前

    为了更好地阅读和格式化,可以使用括号。

    call :func resultVar
    echo(%resultVar%
    goto :eof
    
    :func 
    setlocal
    set var=2
    (
      endlocal
      if "%1" NEQ "" set "%1=%var%"
      goto :eof
    )
    

    解析器在执行命令块之前展开前两个阶段(百分比变量和转义字符)。 其他阶段及时执行(如延迟扩展、第二阶段的调用扩展…)

        3
  •  0
  •   imjared    11 年前

    endlocal && set aaa=%aaa% && set bbb=%bbb% aaa bbb setlocal 并将此设置保留在命令提示符中以供另一个批处理文件使用(对于exmaple,如果批处理文件包含 设置本地 从另一个批处理文件调用,调用的批处理文件现在将具有新的设置 bbb公司

    endlocal && set . 我浏览了无数的网站来解决这个问题。