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

PATH的预挂目录有条件地失败,C:\程序文件(x86)已在PATH中

  •  0
  • selbie  · 技术社区  · 5 年前

    Windows 10 cmd脚本问题。

    尝试在.cmd脚本中有条件地更新我的PATH环境变量。我想在前面添加一些东西 PATH 基于另一个环境变量的存在。如果未设置环境变量,则不应将任何内容添加到PATH中。如果已设置,请将其添加到前面。

    这是我的最小可重复示例。将以下内容保存到 script.cmd 磁盘上的文件:

    echo off
    REM Simulate a user with a PATH that has C:\program files (x86) within it
    PATH c:\program files (x86)\my company app;%PATH%
    
    set _PERL_PATH=D:\projects\strawberry\perl\bin
    set _NASM_PATH=D:\projects\nasm
    
    if NOT "%_PERL_PATH%"=="" (PATH %_PERL_PATH%;%PATH%)
    if NOT "%_NASM_PATH%"=="" (PATH %_NASM_PATH%;%PATH%)
    if NOT "%_GIT_PATH%"=="" (PATH %_GIT_PATH%;%PATH%)
    

    然后通过执行以下命令来运行它 script.cmd 命令行文件

    D:\script.cmd
    

    结果:

    D:\>echo off
    \my was unexpected at this time.
    

    以上都是一个模拟示例。即使我没有明确添加 C:\program files (x86)\my company app 首先,对于PATH,在此脚本之前运行的其他脚本将执行类似的操作(即:Visual Studio的vcvars32.bat)

    我认为这与空格和缺少引号有关。但经过一些实验,它与 (x86)\ 初始PATH中的序列。

    我该怎么修?

    0 回复  |  直到 5 年前
        1
  •  1
  •   jwdonahue    5 年前

    你不需要一行parens如果身体:

    if NOT "%_PERL_PATH%"=="" PATH %_PERL_PATH%;%PATH%
    if NOT "%_NASM_PATH%"=="" PATH %_NASM_PATH%;%PATH%
    if NOT "%_GIT_PATH%"=="" PATH %_GIT_PATH%;%PATH%
    

    正如@squarshman和@Mofi所指出的,如果任何路径字符串包含以下任何符号,上述代码仍可能遇到问题:

    &()[]{}^=;!'+,`~
    

    因为它们是脚本运算符,可能会混淆解释器。避免这些问题的最佳方法是在可能包含以下内容之一的内容周围加上引号:

    set "path=c:\program files (x86)\my company app;%PATH%"
    

    因此,有了它,您可以安全地在您的 if 语句,即使你实际上并不需要它们:

    if NOT "%_PERL_PATH%"=="" (set "PATH=%_PERL_PATH%;%PATH%")
    if NOT "%_NASM_PATH%"=="" (set "PATH=%_NASM_PATH%;%PATH%")
    if NOT "%_GIT_PATH%"=="" (set "PATH=%_GIT_PATH%;%PATH%")
    

    现在嵌入的paren位于引号字符串中,因此它们不会让解释器误以为你有多个脚本块。

        2
  •  0
  •   Magoo    5 年前
    @ECHO OFF
    SETLOCAL
    
    set _PERL_PATH=D:\projects\strawberry\perl\bin
    set _NASM_PATH=D:\projects\nasm
    
    SET "modifiedpath=%_GIT_path%;%_NASM_PATH%;%_PERL_PATH%;c:\program files (x86)\my company app;%PATH%"
    
    :lopsemis
    IF "%modifiedpath:~0,1%" equ ";" SET "modifiedpath=%modifiedpath:~1%"&GOTO lopsemis
    IF "%modifiedpath%" neq "%modifiedpath:;;=;%" SET "modifiedpath=%modifiedpath:;;=;%"&GOTO lopsemis
    ECHO %PATH%
    ECHO %modifiedpath%
    
    :: method2
    SET "modifiedpath=c:\program files (x86)\my company app;%PATH%"
    IF DEFINED _PERL_PATH SET "modifiedpath=%_perl_path%;%modifiedpath%"
    IF DEFINED _nasm_PATH SET "modifiedpath=%_nasm_path%;%modifiedpath%"
    IF DEFINED _git_PATH SET "modifiedpath=%_git_path%;%modifiedpath%"
    ECHO %PATH%
    ECHO %modifiedpath%
    
    
    GOTO :EOF
    

    还是我错过了一些基本的东西?

    推荐文章