我想知道您用来管理系统中可执行文件的方法是什么。例如,我几乎可以通过命令行访问所有内容,但是现在我达到了路径字符串的限制,因此我无法再添加任何目录。
那么您有什么建议呢?很久以前,我尝试在目录中使用Dir中可执行文件的软链接,但是这种方法不起作用。将“仅可执行文件”扔给已知的Dir,存在几乎所有应用程序都需要一组文件的问题,因此这也是不好的。将可执行文件和他的所有文件扔到一个已知的Dir,mmm,这可以工作,但是文件名冲突的可能性非常高。创建HardLink?我不知道。你怎么看?
我想知道您用来管理系统中可执行文件的方法是什么。例如,我几乎可以通过命令行访问所有内容,但是现在我达到了路径字符串的限制,因此我无法再添加任何目录。
那么您有什么建议呢?很久以前,我尝试在目录中使用Dir中可执行文件的软链接,但是这种方法不起作用。将“仅可执行文件”扔给已知的Dir,存在几乎所有应用程序都需要一组文件的问题,因此这也是不好的。将可执行文件和他的所有文件扔到一个已知的Dir,mmm,这可以工作,但是文件名冲突的可能性非常高。创建HardLink?我不知道。你怎么看?
Answers:
我可以想到的一种方法是使用其他环境变量来存储部分路径。例如,如果您有
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
目录,该目录包含.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%
最后,您看到的是输出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%
通常,您应该谨慎地从Internet运行批处理文件,因为您可以使用批处理文件执行各种操作,例如格式化硬盘。如果您不信任上面的代码(我写过),则可以通过替换以下行来对其进行测试
%actualdir%\%actualfile% %args%
与
echo %actualdir%\%actualfile% %args%
理想情况下,在运行之前,您应该确切知道每一行的功能。
cmd
,请注意,您可以*
用来保存输入内容。因此,例如,从根目录输入dir /x pro*
。您将在其中看到所需的目录及其8dot3名称。然后使用cd
导航到它并重复该过程。
$PATH
工作原理与%PATH%
Windows 十分相似,因此我不确定您的意思是什么。按照惯例,UNIX目录名通常比Windows中的短,因此结果$PATH
也往往更短。
这将解析您的%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个字符,否则它不会让我
如果您使用的是Windows Vista或更高版本,则可以建立指向该文件夹的符号链接。例如:
mklink /d C:\pf "C:\Program Files"
会链接,所以c:\pf
您的program files
文件夹也将链接。通过使用此技巧,我从路径中删除了300个字符。
c:\Program Files
和的实例替换 c:\Program Files (x86)
为预定义的变量%ProgramFiles%
和%ProgramFiles(x86)%
tenforums.com/tutorials/…,每个实例仅保存几个字符。 ,但是如果您真的要最大化PATH的边缘,那就可能有所不同。为此,我将创建%pf%和%pfx%解析为正确的路径。谢谢你的主意!:)
如果有人有兴趣...
我发现我从来没有真正需要过所有这些路径,因此我创建了一堆“初始化”批处理文件,它们会相应地修改路径。
例如,如果我想在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
路径上的目录中否则,我将向目录中添加一个简单的cmd / batch文件,c:\util
如下所示:
@"c:\program files\whereever\foo.exe" %*
本质上为命令创建了别名。不一定完美。有些程序确实坚持要走这条路(在当今,这种情况很少见),而其他尝试调用它的程序可能找不到正确的路径。但对于大多数用途来说,它的效果很好。
但是总的来说,我不必担心避免在目录中添加目录。
对于特定于应用程序的路径,请使用“应用程序路径”注册表项而不是路径变量:
http://msdn.microsoft.com/zh-CN/library/windows/desktop/ee872121(v=vs.85).aspx
我经常编写并使用标准流(stdin / stderr / stdout)和退出代码PROXY程序(称为dispatcher https://github.com/131/dispatcher)
我正在使用的所有CLI程序(节点,php,python,git,svn,rsync,plink ...)实际上都是相同的exe文件(大约10kb,我只是用不同的名字命名),我将其放在同一目录。虚拟静态明文文件执行“代理文件名到真实exe的映射”。
调度程序使用底层流程管理win32 API绝对透明。
使用此软件,我在PATH中仅为我可能使用的所有程序设置了一个附加目录。
创建文件夹c:\ bin并添加到您的路径并进行硬链接(如您所说的那样)会缩短字符串。也许将变量pf添加到具有值c:\ Program Files的系统变量中,然后用路径中的%pf%替换c:\ Program Files。
编辑:
创建一个虚拟驱动器。替代p:“ c:\ program files”
我按照以下步骤使条目易于管理:
为软件包用法的不同组合创建了不同的用户。示例:(a)创建一个用户网络,以使所有网络开发软件可用;(b)创建一个用户数据库,以使所有数据库和数据仓库软件包可用。请记住,某些软件可能会创建多个条目。或有时我将其分为特定于oracle,特定于MSSQL和特定于oracle的用户。我将MySQL / PostgreSQL,tomcat,wamp,xamp全部放入用户帐户webr。
如果可能,请安装通用软件包,如office,photoshop,..作为对所有用户可用的系统专用软件包,以及作为用户特定的特殊软件包。当然,我必须登录到不同的用户并安装它们。并非所有软件都可以提供此选项。如果“仅为此用户安装”选项不可用,请在整个系统上安装它。
我避免将程序安装到文件夹Program File(x86)或Program File中。我总是安装到基本目录中。例如,MySQL 64位进入“ C:\ mysql64”,而MySQL 32位进入“ C:\ mysql”文件夹。我总是假设仅为64位软件添加后缀64。如果没有后缀,则为32位。我对Java和其他人也遵循相同的原则。这样,我的路径将更短,不包括“ C:\ Program File(x86)”。对于某些软件,可能需要编辑配置文件以显示.exe文件的确切位置。只有需要安装到“ C:\ Program File(x86)”中的程序才会安装到该文件夹中。我总是记得要缩短名字。我避免使用类似tomcat / release / version-2.5.0.3这样的版本号。如果我需要知道版本,我通过名称版本创建文件,并将其放入tomcat文件夹。通常,请尽可能缩短链接。
如果上述所有步骤均超过Windows限制,则包括任何批处理以替换指向该路径的缩写链接。
然后登录到特定于用法的(移动应用程序,数据库/数据仓库或Web开发...)用户并执行相关任务。
您也可以在Windows中创建虚拟窗口。只要您拥有一个许可的OS副本,就可以使用相同的密钥创建多个虚拟窗口。您可以将特定于特定任务的软件包放入该计算机中。您每次必须启动单独的VM。一些内存密集型软件包,例如3D动画电影制作者,都应该放到主机中,而不是放到VM中,因为VM只有一部分可用的RAM。但是,启动每个VM都很麻烦。
上述解决方案仅在您可以缩小路径的情况下有效。就我而言,这并不是真正的选择,每次我打开命令提示符时都必须运行脚本是一件麻烦事。因此,我编写了一个简单的脚本,该脚本在打开命令提示符时自动运行,并将文本文件的内容附加到您的路径中。
在某些情况下,运行此脚本会使事情中断(例如,在github或cygwin shell中),因此我还添加了一个包含路径列表的文件,如果在其中启动了命令提示符,则路径变量为不会通过通常会更新路径的启动脚本进行更改。
@echo off
:: Modify these to the actual paths of these two files
set dontSetupFile=C:\Users\Yams\Dontsetup.txt
set pathFile=C:\Users\Yams\Path.txt
:: Retrieve the current path (for determining whether or not we should append to our path)
set curDir=%cd%
:: Be done if the current path is listed in the dontSetupFile
SetLocal EnableDelayedExpansion
for /F "delims=" %%i in (%dontSetupFile%) do (
if "%%i"=="%curDir%" GOTO AllDone
)
:: Append the pathFile to our current PATH
set pathAppend=
for /F "delims=" %%i in (%pathFile%) do (set pathAppend=!pathAppend!%%i)
set PATH=%PATH%;%pathAppend%
:: The only way to actually modify a command prompt's path via a batch file is by starting
:: up another command prompt window. So we will do this, however, if this script is
:: automatically called on startup of any command prompt window, it will infinately
:: recurse and bad things will happen.
:: If we already ran, we are done
if "%yams%"=="onion" GOTO AllDone
:: Otherwise, flag that we just ran, and then start up a new command prompt window
:: with this flag set
set yams=onion
cmd \K set PATH=%PATH%;
:: When that command prompt exits, it will load back up this command prompt window, and
:: then the user will need to exit out of this as well. This causes this window to
:: automatically exit once the cmd it just spawned is closed.
exit()
:: Path is set up, we are done!
:AllDone
@echo on
而且Path.txt看起来像
C:\Program Files (x86)\Google\google_appengine;
C:\Program Files (x86)\ATI Technologies\ATI.ACE\Core-Static;
C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;
C:\Program Files\Microsoft SQL Server\110\Tools\Binn;
C:\Program Files\Microsoft DNX\Dnvm;
C:\Program Files (x86)\Windows Kits\8.0\Windows Performance Toolkit;
虽然Dontsetup.txt看起来像
C:\Program Files (x86)\Windows Kits\8.0\Windows Performance Toolkit
C:\Program Files (x86)\Git\cmd
C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\bin
要使其在启动时自动运行,请打开regedit,导航至HKEY_LOCAL_MACHINE / SOFTWARE / Microsoft / Command Processor,然后右键单击右侧的内容,然后按new-> Multi-String Value。将其命名为“自动运行”。将其值设置为
C:\Users\Yams\setUpPath.bat
或您在上面存储批处理文件的其他位置。
没尝试过,但是将PATH分成多个部分工作并将它们加入最终变量工作中可以吗?
最初的示例假设您有类似
PATH={LONGPATH1};{LONGPATH2};....{2048th char}....{LONGPATH_N-1};{LONGPATH_N}
相反,您创建:
_PATH1 = {LONGPATH1};{LONGPATH2};....{2048 char}
_PATH2 = {2049th char}...{LONGPATH_N-1};{LONGPATH_N}
rem // may be more parts
PATH = %_PATH1%;%_PATH2%