如果使用批处理文件不存在则设置环境变量

时间:2016-06-27 04:19:19

标签: batch-file windows-server-2012

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

@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

但有些人如何不按预期工作。我能够设置变量,但即使变量存在,它也会再次设置,然后退出。

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

1 个答案:

答案 0 :(得分:0)

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

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

更好的方法是关注代码,检查系统路径附加中是否存在%oracle_home%\perl\bin或其扩展的等效项,而不是将其预先添加到系统路径如果系统路径中不存在。

@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上不可用。

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

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

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