Windows PATH /环境变量管理的最佳实践?


22

现在,这真是一团糟。每次我安装一个在命令行中执行微不足道的新程序时,都必须将其添加到路径中。实际上,我正在使用Ruby进行开发,甚至gems(插件/扩展名)有时都有自己的可执行文件,并且存储在不同的文件夹中,最终我还必须为每个应用程序添加多个路径。到了我要在PATH环境变量中推送30条路径的地步。

我谨慎地将它们复制并粘贴到各种主文件夹中并为其设置路径;只是感觉不对。我是否缺少确定的最佳实践?


这是一个很大的问题-在UNIX上运行程序非常容易,但是在Windows上却很难。可惜的是,唯一的解决方案仍然看起来像是这么辛苦...
user10550

Answers:


13

我的%UserProfile%\Apps文件夹中包含许多小型独立实用程序,例如存档器等。然后有许多我编写并经常使用的批处理文件,它们位于中%UserProfile%\Batches。其余的,我只是将它们添加到中PATH,这可以由安装程序完成,也可以通过

setx PATH "%PATH%;%CD%"

从适当的目录。如果内容太长(环境变量有长度限制),那么那里的路径数量可能只会成为问题。

您可以(有时我也可以)为此类程序编写小型包装批处理文件。在Windows上,简单地将可执行文件复制/硬链接/符号链接到另一个目录可能不会起作用,但是您可以轻松地创建一个批处理文件,例如针对程序Foo:

@"%ProgramFiles%\Foosoft Foo\foo.exe" %*

然后您可以将用于存储这些批处理文件的文件夹添加到PATH


这些包装批处理文件如何工作?它们是否按照要求的实际路径工作?如果是这样,那就太神奇了。
贾斯汀·L.2010年

@Justin:他们只是将批处理文件中提供的所有参数委托给实际程序。您必须知道自己所在的位置。
乔伊(Joey)

嗯 我应该弄清楚-将二进制文件的目录添加到PATH和将二进制文件的wapper批处理文件创建到PATH上的自定义目录之间有功能上的区别吗?
贾斯汀·L.2010年

@Justin:如果您再次在批处理文件中使用批处理文件,则存在。除此之外,我什么都不知道。
乔伊

@Joey我喜欢包装器的想法,它很适合从cmd启动程序,但是当从start..run启动时,这会分散cmd窗口在程序启动之前跳转的注意力,您有办法解决吗?似乎也可以将所有程序的目录放在路径中,并使其较长。如此近,却如此远!
barlop 2012年

10

我不确定是否有任何特定的最佳做法。但是我更喜欢使用GUI PATH编辑器工具来管理PATH变量。这样就可以清楚地维护它。

PATH编辑器列表-

快速环境编辑器

Redmond PATH编辑器


图形编辑器可能会使事情变得容易得多
贾斯汀·L.2010年

那个Redmond PATH编辑器正是我要找的东西。+1
内森·里德利

问题是关于管理变量,而不仅仅是添加项目。因此,这是最正确的答案,而IMO是最佳实践,因为其他解决方案隐藏了PATH变量的大部分内容。
taurelas

2

现在大多数Windows计算机都随PowerShell一起提供,我在用户配置文件中使用了许多sal / Set-Alias命令,因此,如果一个应用程序只有一个或两个我使用的应用程序,我将仅为这两个命令创建别名,而不是添加整个应用文件夹到路径。示例包括SQL Management Studio,Notepad ++,TFS Power Tools(命令行工具tfpt.exe)。我还跨计算机复制了我的用户配置文件,因此这使我可以在创建别名之前检查当前计算机上该应用程序是否存在(有时会警告您是否未安装应用程序)。

filter ctQuoteString { "`"$_`"" }
filter ctResolvePath { Resolve-Path $_ | select -ExpandProperty Path | ctQuoteString } # used in Edit.ps1

$nppExe = "C:\Program Files (x86)\Notepad++\notepad++.exe"
if ((Test-Path variable:\nppExe) -and (Test-Path $nppExe)) {
    function EditNotepadPP { 
        param ([parameter(ValueFromPipelineByPropertyName=$true)][Alias("FullName","FileName")]$Path) 
        begin { if (! $nppExe) { throw 'variable $nppExe is not defined' } }
        process {
            $Path | ctResolvePath | % { # ctResolvePath will get full path and surround with quotes
                & $nppExe $_
            }
            #AddEditHistory $Path #if you need detailed time tracking, might help to create a log what files you're editting
       } 
    }
    Set-Alias npp EditNotepadPP
}

# I have similar functions for other apps.
Set-Alias vs EditVS
Set-Alias tfe EditTFCheckout
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.