【问题标题】:setting environment variable if not present using batch file如果不存在使用批处理文件设置环境变量
【发布时间】:2016-06-27 04:19:18
【问题描述】:

我正在尝试设置一个环境变量以防它不存在,如果它存在,则脚本将退出。我正在尝试使用以下代码。

@echo off
echo %machine% > c:\machineoutput.txt
findstr /I /c:"C:\Oracle\Ora12c\perl\bin" c:\machineoutput.txt
if %errorlevel% == 0 (
    goto SETPATH
) else (
    EOF
)
:SETPATH
setx /m machine "%oracle_home%\perl\bin;%path%"
:EOF
exit

但有些地方并没有按应有的方式工作。我可以设置变量,但即使变量存在,它也会再次设置它然后退出。

请帮助我找出我做错了什么。

【问题讨论】:

  • 为什么你在第一个分支goto SETPATH,但只在EOF 没有去其他分支的任何地方?
  • @LưuVĩnhPhúc 这个批处理文件是从另一个批处理文件中调用的,所以如果路径存在,这个批处理文件将被终止,并且调用它的父批处理文件将恢复它的操作。所以我如果路径存在,我将在此文件中进入 EOF,否则将设置路径。
  • 不,EOF 不是一个有效的命令,你会得到错误。如果你想去脚趾EOF标签,使用goto EOF

标签: batch-file windows-server-2012


【解决方案1】:

不知道你为什么要检查C:\Oracle\Ora12c\perl\bin是否存在于非标准环境变量machine中以确定是否应该将%oracle_home%\perl\bin添加到系统环境变量PATH强>。我建议检查系统 PATH 是否存在此目录路径。

EOF 不是有效命令。因此,Windows 命令处理器输出一条错误消息并继续下一个命令行,即带有setx 的行。这就是您的批处理代码不起作用的原因。 ELSE 分支中的命令应该是goto :EOF

最好遵循检查%oracle_home%\perl\bin或其扩展等效项是否存在于系统PATH追加而不是将其添加到系统PATH 如果系统 PATH 中不存在。

@echo off
if not exist "%oracle_home%\perl\bin\*" goto :EOF
setlocal EnableExtensions DisableDelayedExpansion

for /F "skip=2 tokens=1,2*" %%N in ('%SystemRoot%\System32\reg.exe query "HKLM\System\CurrentControlSet\Control\Session Manager\Environment" /v "Path" 2^>nul') do (
    if /I "%%N" == "Path" (
        set "SystemPath=%%P"
        if defined SystemPath goto CheckPath
    )
)
echo Error: System environment variable PATH not found with a non-empty value.
echo/
endlocal
pause
goto :EOF

:CheckPath
setlocal EnableDelayedExpansion
set "Separator="
set "PathToAdd=%%oracle_home%%\perl\bin"
set "OraclePerlPath=%oracle_home%\perl\bin"
if not "!SystemPath:~-1!" == ";" set "Separator=;"
if "!SystemPath:%PathToAdd%=!" == "!SystemPath!" (
    if "!SystemPath:%OraclePerlPath%=!" == "!SystemPath!" (
        set "PathToSet=!SystemPath!%Separator%!PathToAdd!"
        set "UseSetx=1"
        if not "!PathToSet:~1024,1!" == "" set "UseSetx="
        if not exist %SystemRoot%\System32\setx.exe set "UseSetx="
        if defined UseSetx (
            %SystemRoot%\System32\setx.exe Path "!PathToSet!" /M >nul
        ) else (
            set "ValueType=REG_EXPAND_SZ"
            if "!PathToSet:%%=!" == "!PathToSet!" set "ValueType=REG_SZ"
            %SystemRoot%\System32\reg.exe ADD "HKLM\System\CurrentControlSet\Control\Session Manager\Environment" /f /v Path /t !ValueType! /d "!PathToSet!" >nul
        )
    )
)
endlocal
endlocal

有关此批次代码的详细信息,请阅读Why are other folder paths also added to system PATH with SetX and not only the specified folder path? 上用作此批次代码模板的答案。它还解释了为什么有问题的批处理代码绝对不好。

注意 1: 命令 setx 在 Windows XP 上默认不可用。

注意 2: 命令setx 将超过 1024 个字符的值截断为 1024 个字符。

要了解所使用的命令及其工作原理,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读每个命令显示的所有帮助页面。

  • echo /?
  • endlocal /?
  • for /?
  • goto /?
  • if /?
  • pause /?
  • reg /?reg add /?reg query /?
  • set /?
  • setlocal /?
  • setx /?

【讨论】:

    猜你喜欢
    • 2014-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-21
    • 2011-04-17
    • 2017-07-05
    • 2011-10-02
    相关资源
    最近更新 更多