1

有人说他们的路径太长,但是,问题往往是由于重复调用相同的批处理脚本,代码如set mypath=%mypath%;appendix. 人们只是没有意识到这一点。我提出了一个解决方案来在退出时恢复环境变量

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

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

我们可以从智能附录开始。我的意思是问题是由无条件附加路径引起的。您的路径上已经有附录,但一遍又一遍地添加它。这就是问题的根源。我认为同样的问题也适用于 bash。可能我可以检查路径并只添加那些丢失的条目吗?什么是标准溶液?

4

4 回答 4

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%
于 2013-10-28T09:29:40.763 回答
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

……

于 2013-10-28T10:29:28.320 回答
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为类路径以获取其元素的短路径。最终可能会有所帮助。

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

于 2013-10-28T09:25:33.107 回答
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)之外的任何其他变量。

于 2013-10-28T19:09:37.383 回答