如何避免在Windows中过度填充PATH环境变量?

mjs*_*jsr 114 windows executable path environment-variables

我想知道您用于管理系统中可执行文件的方法是什么.例如,我几乎可以通过命令行访问所有内容,但现在我达到了路径字符串的限制,所以我无法再添加任何dir.

那么你推荐什么?很久以前,我尝试在属于路径的Dir中使用可执行文件的softLinks,但这种方法不起作用.将"只有可执行文件"抛给已知的Dir,几乎任何应用程序都需要一组文件,所以这也很糟糕.将可执行文件和他的所有文件都抛给一个已知的Dir,这样就可以了,但是在文件名中出现冲突的可能性非常高.创建一个HardLink?我不知道.你怎么看?

Mit*_*rtz 83

我能想到的一种方法是使用其他环境变量来存储部分路径; 例如,如果你有

C:\this_is_a\long_path\that_appears\in_multiple_places\subdir1;
C:\this_is_a\long_path\that_appears\in_multiple_places\subdir2;
Run Code Online (Sandbox Code Playgroud)

然后你可以创建一个新的环境变量,如

SET P1=C:\this_is_a\long_path\that_appears\in_multiple_places
Run Code Online (Sandbox Code Playgroud)

之后您的原始路径将成为

%P1%\subdir1;
%P1%\subdir2;
Run Code Online (Sandbox Code Playgroud)

编辑:另一种选择是创建一个bin目录,其中包含.bat指向相应.exe文件的文件.

编辑2: Ben Voigt对另一个答案的评论提到,建议使用其他环境变量可能不会减少长度,%PATH%因为它们在存储之前会被扩展.这可能是真的,我还没有测试过.另一种选择是将8dot3表单用于更长的目录名称,例如C:\Program Files通常等同于C:\PROGRA~1.您可以使用dir /x查看较短的名称.

编辑3:这个简单的测试让我相信Ben Voigt是对的.

set test1=hello
set test2=%test1%hello
set test1=bye
echo %test2%
Run Code Online (Sandbox Code Playgroud)

在这结束时,你看到输出hellohello而不是byehello.

编辑4:如果您决定使用批处理文件来消除某些路径%PATH%,您可能会担心如何将批处理文件中的参数传递给可执行文件,以使该过程是透明的(即,您不会注意到任何差异在调用批处理文件和调用可执行文件之间.我没有很多编写批处理文件的经验,但这似乎工作正常.

@echo off

rem This batch file points to an executable of the same name
rem that is located in another directory. Specify the directory
rem here:

set actualdir=c:\this_is\an_example_path

rem You do not need to change anything that follows.

set actualfile=%0
set args=%1
:beginloop
if "%1" == "" goto endloop
shift
set args=%args% %1
goto beginloop
:endloop
%actualdir%\%actualfile% %args%
Run Code Online (Sandbox Code Playgroud)

作为一般规则,您应该小心从Internet运行批处理文件,因为您可以使用批处理文件(例如格式化硬盘驱动器)执行各种操作.如果您不信任上面的代码(我写的),您可以通过替换该行来测试它

%actualdir%\%actualfile% %args%
Run Code Online (Sandbox Code Playgroud)

echo %actualdir%\%actualfile% %args%
Run Code Online (Sandbox Code Playgroud)

理想情况下,在运行之前,您应该确切知道每条线的作用.

  • 谢谢Mitch,你提供的Edit 4是我想要的!现在我可以拥有我需要的所有二进制文件的集中文件夹.我打算在深度测试更多以查看某个应用程序是否存在问题 (2认同)
  • 您的"编辑4"部分过于复杂,无法将参数传递给可执行文件.请参阅Michael Burr的回答. (2认同)

Tod*_*ith 81

这将解析您的%PATH%环境变量并将每个目录转换为其等效的短名称,然后将它们全部重新组合在一起:

@echo off

SET MyPath=%PATH%
echo %MyPath%
echo --

setlocal EnableDelayedExpansion

SET TempPath="%MyPath:;=";"%"
SET var=
FOR %%a IN (%TempPath%) DO (
    IF exist %%~sa (
        SET "var=!var!;%%~sa"
    ) ELSE (
        echo %%a does not exist
    )
)

echo --
echo !var:~1!
Run Code Online (Sandbox Code Playgroud)

获取输出并更新环境变量中的PATH变量.

  • 快速环境编辑器是另一种方法.它突出显示不存在的目录,并有一个选项"将长路径转换为短路径". (26认同)
  • @RussellGallop:先生,这是一个很棒的工具. (3认同)
  • 这也很有用,因为它告诉我路径中随时间累积的所有不存在的目录. (2认同)

小智 28

如果您使用的是Windows Vista或更高版本,则可以创建指向该文件夹的符号链接.例如:

mklink /d C:\pf "C:\Program Files"

会做一个链接所以c:\pf你的program files文件夹.我通过使用这个技巧削减了300个字符.


Yel*_*ika 10

万一有人感兴趣......

我发现我从来没有真正需要所有这些路径,所以我创建了一堆"初始化"批处理文件,相应地修改路径.

例如,如果我想在Eclipse中进行一些C++开发,我会这样做:

> initmingw
> initeclipse
> eclipse
Run Code Online (Sandbox Code Playgroud)

这对于避免具有相同名称的可执行文件(例如C++和D编译器,它们都具有make.exe)之间的冲突也很方便.

我的批处理文件通常如下所示:

@echo off
set PATH=C:\Path\To\My\Stuff1;%PATH%
set PATH=C:\Path\To\My\Stuff2;%PATH%
Run Code Online (Sandbox Code Playgroud)

我发现这种方法比较干净,并且还没有遇到任何问题.


Mic*_*urr 6

我通常不必担心这个问题(我没有遇到路径大小限制 - 我甚至不知道现代Windows系统上是什么),但这是我可以做的,以避免将程序的目录放入路径:

  • 大多数命令行实用程序都被抛入c:\util路径中的目录
  • 否则,我将一个简单的cmd /批处理文件添加到c:\util看起来像这样的目录:

    @"c:\program files\whereever\foo.exe" %*
    
    Run Code Online (Sandbox Code Playgroud)

这实质上为命令创建了一个别名.它不一定完美.有些程序真的坚持走在路上(现在很少见),其他试图调用它的程序可能找不到它.但对于大多数用途,它运作良好.

但一般来说,我不必担心避免在路径中添加目录.


And*_*Eve 5

另一个想法:使用DIR/X确定为非8dot3文件名生成的短名称.然后在%PATH%中使用这些.

例如,'C:\ Program Files'变为'C:\ PROGRA~1'.


Mad*_*ter 5

使用App Path注册表项而不是特定于应用程序的路径的路径变量:

http://msdn.microsoft.com/en-us/library/windows/desktop/ee872121(v=vs.85).aspx