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)
理想情况下,在运行之前,您应该确切知道每条线的作用.
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变量.
小智 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)
我发现这种方法比较干净,并且还没有遇到任何问题.
我通常不必担心这个问题(我没有遇到路径大小限制 - 我甚至不知道现代Windows系统上是什么),但这是我可以做的,以避免将程序的目录放入路径:
c:\util路径中的目录否则,我将一个简单的cmd /批处理文件添加到c:\util看起来像这样的目录:
@"c:\program files\whereever\foo.exe" %*
Run Code Online (Sandbox Code Playgroud)这实质上为命令创建了一个别名.它不一定完美.有些程序真的坚持走在路上(现在很少见),其他试图调用它的程序可能找不到它.但对于大多数用途,它运作良好.
但一般来说,我不必担心避免在路径中添加目录.
使用App Path注册表项而不是特定于应用程序的路径的路径变量:
http://msdn.microsoft.com/en-us/library/windows/desktop/ee872121(v=vs.85).aspx