有些人说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。我可以检查路径并只添加那些丢失的条目吗?什么是标准解决方案?
答案 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
)。