路径初始化:防止“输入行太长”

时间:2013-10-28 08:51:22

标签: shell batch-file path environment-variables

有些人说their path is too long,但是,问题通常是由使用代码set mypath=%mypath%;appendix重复调用相同批处理脚本引起的。 People just do not realize that。我proposed a solutio n在退出时恢复env变量

set old_path=classpath
set classpath=%classpath%;appendix
java myApp
set classpath=old_path

但这很乏味且容易出错。我可能很容易忘记由于异常,另一个退出路径而恢复或失败。这可以自动完成吗?

我们可以从一个聪明的附录开始。我的意思是问题是由无条件地附加路径引起的。您已经在路径上添加了附录,但一遍又一遍地添加它。这是问题的根源。我认为同样的问题适用于bash。我可以检查路径并只添加那些丢失的条目吗?什么是标准解决方案?

4 个答案:

答案 0 :(得分:4)

首先,您的代码无法正常工作,例如old_path是您上一个命令中的字符串。

set "old_path=%classpath%"
set "classpath=%classpath%;%appendix%"
java myApp
set "classpath=%old_path%"

第二,只需在批处理中使用新环境即可避免此类问题:

@echo off
echo %path%
setlocal
set "path="
echo %path%
endlocal
echo %path%

答案 1 :(得分:2)

已编辑 - 要调整评论中的更正(并且没有jeb,没有防弹,只是尽量不要射击你的脚)

只是为了完成,只有在尚未包含的情况下,此批次才会将一个或多个元素添加到指定的变量

@echo off

    call :addToVariable %*

    exit /b

:addToVariable
    rem %1 = variable name where to add elements
    rem %2 = element to add
    rem %3-... the rest of the elements. Will be shifted to retrieve

    rem if no data, no work
    if "%~1"=="" goto :EOF
    if "%~2"=="" goto :EOF

    rem prepare environment to work
    setlocal enableextensions enabledelayedexpansion

    rem get variable name to work
    set "_var=%~1"

    rem get original value of variable 
    if defined %_var% (
        set "_value=!%_var%:"=!"
        rem " this line does nothing but correct sintax highlighting
    ) else (
        set _value=
    )

    rem skip to arguments with elements to include
    shift

    rem list of elements to add to original variable
    set _add=

:addToVariableLoop
    rem iterate over parameters
    for %%d in ( %1 ) do (

        rem test if new directory already in original or temporary variable
        echo ";!_value!;!_add!;" | findstr /i /c:";%%~d;" >nul 2>nul 

        rem if not in variable, add to temporary variable
        if not errorlevel 1 (
            echo [%%~d] already included
        ) else (
            echo adding [%%~d] 
            set "_add=!_add!;%%~d"
        )

    )

    rem check if more elements are pending in call
    if not "%~2"=="" (
        shift
        goto :addToVariableLoop
    )

    set "_value=%_value%%_add%"

    endlocal & set "%_var%=%_value%"
    goto :EOF

如果批处理文件为pathAdd.cmd,则将路径变量调用添加为

pathAdd path c:\windows;c:\test;"c:\something more"

将classPath变量调用添加为

pathAdd classPath c:\windows\system32\drivers

添加到PSModulePath变量调用为

pathAdd PSModulePath "c:\Somewhere over the rainbow";c:\Users

...

答案 2 :(得分:1)

这是一个重建%path%变量以仅包含短路径的脚本(8.3表示法):

@echo off
setlocal disableDelayedExpansion
REM Creating a Newline variable (the two blank lines are required!)
set NLM=^


set NL=^^^%NLM%%NLM%^%NLM%%NLM%

setlocal enableDelayedExpansion
set _path_=!path:;=%NL%!
rem  iteration
set "short_path="
for /f "delims=" %%I in ("!_path_!") do set  short_path=!short_path!;%%~dpsnxI
endlocal & set short_path=%short_path%
echo %short_path%

endlocal

您可以使用类路径替换PATH以获取其元素的短路径。最终可以提供帮助。

您还可以检查附录的长度和路径,看看您是否达到了极限。 我将使用仅包含缺失元素的脚本更新答案....

答案 3 :(得分:1)

如果此问题的目的是知道如果%PATH%中存在某个给定文件的路径,如果不存在,请插入(并且这是唯一的原因这样做,我认为),那么它可能会以稍微不同的方式解决:“如何检查%PATH%中是否存在某个文件的目录”?这个问题可以通过这种方式轻松解决:

for %%p in (programname.exe) do set "progpath=%%~$PATH:p"
if not defined progpath (
   rem The path to programname.exe don't exist in PATH variable, insert it:
   set "PATH=%PATH%;C:\path\to\progranname"
)

如果您不知道搜索文件的扩展名,请查看所有内容:

set "progpath="
for %%e in (%PATHEXT%) do (
   if not defined progpath (
      for %%p in (programname.%%e) do set "progpath=%%~$PATH:p"
   )
)

此方法适用于任何文件名或扩展名,或PATH之外的任何其他变量(如classpath)。