那么你有什么建议吗? 很久以前,我尝试在属于路径的目录中使用可执行文件的软链接,但那种方法并没有起作用。 将“仅可执行文件”放入已知目录中会出现问题,因为几乎所有应用程序都需要一组文件,因此这也不太好。 将可执行文件及其所有文件放入已知目录中,这可能有效,但是文件名称冲突的可能性非常高。 创建一个硬链接?我不知道。您认为呢?
这将解析您的%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!
将输出结果复制并更新环境变量中的PATH变量。
%%~sa
后缺少闭合引号。我尝试更新回答,但除非更改6个字符,否则无法进行。 - zr870我能想到的一种方法是使用其他环境变量来存储部分路径;例如,如果你有
C:\this_is_a\long_path\that_appears\in_multiple_places\subdir1;
C:\this_is_a\long_path\that_appears\in_multiple_places\subdir2;
那么您可以创建一个新的环境变量,例如:
SET P1=C:\this_is_a\long_path\that_appears\in_multiple_places
之后您的原始路径会变为
%P1%\subdir1;
%P1%\subdir2;
编辑:另一种选择是创建一个名为bin
的目录,其中保存指向适当.exe
文件的.bat
文件。
编辑2:Ben Voigt在另一个答案的评论中提到,使用其他环境变量可能不会减少%PATH%
的长度,因为它们在存储之前会被展开。这可能是真的,我没有进行测试。但是,另一种选择是对长目录名称使用8.3形式,例如C:\Program Files
通常等同于C:\PROGRA~1
。您可以使用dir /x
查看较短的名称。
编辑3:这个简单的测试让我相信Ben Voigt是正确的。
set test1=hello
set test2=%test1%hello
set test1=bye
echo %test2%
在最后,输出结果是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%
作为一般规则,你应该小心从互联网运行批处理文件,因为批处理文件可以做各种事情,比如格式化硬盘。如果你不信任上面的代码(由我编写),你可以通过替换该行来进行测试。%actualdir%\%actualfile% %args%
使用
echo %actualdir%\%actualfile% %args%
理想情况下,在运行每一行代码之前,您应该确切知道它的作用。mklink /d C:\pf "C:\Program Files"
这将创建一个链接,使得 c:\pf 成为您的 program files 文件夹。使用此技巧可以从我的路径中删减300个字符。
c:\Program Files
和 c:\Program Files (x86)
的实例替换为预定义变量 %ProgramFiles%
和 %ProgramFiles(x86)%
。http://www.tenforums.com/tutorials/3234-environment-variables-windows-10-a.html 这些只能节省几个字符,但如果您真的快要达到 PATH 的最大值,这可能会有所不同。 说到这一点,我将创建 %pf% 和 %pfx%,它们将解析为正确的路径。感谢您的建议! :) - rainabba如果有人感兴趣的话...
我发现我从来不需要一次性使用所有路径,所以我创建了一堆“初始化”批处理文件,根据需要修改路径。
例如,如果我想在Eclipse中进行C++开发,我会这样做:
> initmingw
> initeclipse
> eclipse
这也很方便,可以避免具有相同名称的可执行文件之间的冲突(例如C++和D编译器都有一个make.exe)。
我的批处理文件通常看起来像这样:
@echo off
set PATH=C:\Path\To\My\Stuff1;%PATH%
set PATH=C:\Path\To\My\Stuff2;%PATH%
我认为这种方法相对简洁,且尚未遇到任何问题。
通常我不需要担心这个问题(我甚至不知道现代Windows系统上的路径大小限制是什么),但以下是我可能采取的方法,以避免将程序目录添加到路径中:
c:\util
directory that's on the pathotherwise, I'll add a simple cmd/batch file to the c:\util
directory that looks something like:
@"c:\program files\whereever\foo.exe" %*
这条命令本质上创建了一个别名(alias)。它并不完美,有些程序可能会坚持要在路径(path)中(现在很少见),而其他试图调用它的程序可能无法正确找到它。但对于大多数情况,它都能正常工作。
总的来说,我一般不需要担心避免将目录添加到路径中。
cmd /c
,但这反过来又意味着构建脚本变成了Windows特定的:/我已经在单独的问题中询问了这个问题。 - O. R. Mapper创建一个名为c:\bin的文件夹,将其添加到您的路径中,并像您所说的那样进行硬链接,可以缩短字符串。也许可以在系统变量中添加一个名为pf的变量,其值为c:\Program Files,然后在路径中用%pf%替换c:\Program Files。
编辑:
创建一个虚拟驱动器。 subst p: "c:\program files"
我按照以下步骤使条目易于管理:
为不同的软件包使用组合创建不同的用户。 例如:(a) 创建一个名为web的用户,以提供所有Web开发软件;(b) 创建一个名为database的用户,以提供所有数据库和数据仓库软件包。请记住,有些软件可能会创建多个条目。或者有时我将其分成Oracle特定、MSSQL特定和Oracle特定用户。我将MySQL/PostgreSQL、Tomcat、Wamp、Xamp全部放入用户帐户webr中。
如果可能,将常用软件包(如Office、Photoshop等)安装为系统特定,供所有用户使用,将特殊软件包安装为用户特定。当然,我必须登录不同的用户并安装它们。并非所有软件都提供此选项。如果“仅为此用户安装”选项不可用,请为整个系统安装。
我避免将程序安装到Program File (x86)文件夹或Program File文件夹中。我总是安装到基本目录中。例如,64位的MySQL安装在“C:\mysql64”中,32位的MySQL安装在“C:\mysql”文件夹中。我总是假设只有64位软件才添加后缀64。如果没有后缀,则是32位。我对Java和其他软件也采用同样的方法。这样我的路径会更短,不包括“C:\Program File (x86)”这样的路径。对于某些软件,配置文件可能需要编辑以显示.exe文件的确切位置。只有要求安装到“C:\Program File (x86)”文件夹中的程序才会安装到该文件夹中。我总是记得缩短名称。我避免版本号,例如tomcat/release/version-2.5.0.3等细节。如果我需要知道版本,我会创建一个名为version的文件并将其放入tomcat文件夹中。总的来说,尽可能缩短链接。
如果所有上述步骤都通过了Windows限制,请包括任何批处理以替换缩写链接到路径。
然后,登录到特定使用(移动应用程序、数据库/数据仓库或Web开发.. ..)的用户并执行相关任务。
您还可以在Windows内创建虚拟窗口。只要您拥有一个经过许可的操作系统副本,就可以使用相同的密钥创建多个虚拟窗口。您可以将特定于特定任务的软件包放入该计算机中。每次必须启动单独的VM。像3D动画电影制作人一样的某些内存密集型软件包都应该放在主机器中,而不是放在VM中,因为VM只能使用部分可用于其使用的RAM。但是,每次启动VM都很麻烦。