2016-12-01 80 views
0

在批处理文件中,我需要添加一些路径到PATH env变量。由于它有更多的长路径,我试图将它们分散到多行上,并尝试通过缩进行使尽可能清晰的蝙蝠文件。设置路线与多行

但似乎换行符开始处的空格(以及%PATH%)被解释为实际路径的一部分。 所以

SET PATH=^ 
    \\somewhere\Tools\strawberryperl\perl\site\bin;^ 
    \\somewhere\Tools\strawberryperl\perl\bin;^ 
    \\somewhere\Tools\strawberryperl\c\bin;^ 
    \\somewhere\Tools\KDiff3;^ 
    %PATH% 

不起作用(程序未找到)。我可以使用一些技巧吗? 因为它是一个中等复杂的批处理文件,所以一些缩进会很好。

+0

我认为你必须把领先';'那里Path变量通常对于没有一个结束。你有没有试过用'echo%PATH%'检查变量的值? – geisterfurz007

+0

删除缩进空格,它将工作... – aschipfl

回答

2

没有办法让PATH忽略前导空格。我看到了两个可能的选项,如果你想缩进的行:

选项1 - 使用未定义的变量来缩进,所以空间从来没有在价值

@echo off 
SET PATH=^ 
% =%\\somewhere\Tools\strawberryperl\perl\site\bin;^ 
% =%\\somewhere\Tools\strawberryperl\perl\bin;^ 
% =%\\somewhere\Tools\strawberryperl\c\bin;^ 
% =%\\somewhere\Tools\KDiff3;^ 
% =%%PATH% 

选项2得到 - 删除空格之后

@echo off 
SET PATH=^ 
    \\somewhere\Tools\strawberryperl\perl\site\bin;^ 
    \\somewhere\Tools\strawberryperl\perl\bin;^ 
    \\somewhere\Tools\strawberryperl\c\bin;^ 
    \\somewhere\Tools\KDiff3;^ 
    %PATH% 
set "PATH=%PATH:; =%" 
+0

对不起,%PATH%在复制和粘贴过程中丢失了 –

3
for %%x in (
    "\\somewhere\Tools\strawberryperl\perl\site\bin;" 
    "\\somewhere\Tools\strawberryperl\perl\bin;" 
    "\\somewhere\Tools\strawberryperl\c\bin;" 
    "\\somewhere\Tools\KDiff3;" 
) do call set "path=%%path%%%%~x" 

这将追加多余的项目为path。你需要初始化path没有什么首先如果你想要的是建立指定的目录序列。

+0

我正在将这个选项添加到我的答案当你的答案弹出:-)所以我取消了我的编辑 – dbenham

+0

因为我想添加在路径的前面,这会颠倒新路径的顺序,因此必须以相反的顺序直观地指定它们。 –

1

首先,让我开始通知您,以这种方式添加到PATH变量仅适用于正在运行的会话。一旦cmd会话关闭,该变量返回到其先前的值。

这里有一个建议,一个追加每次添加一个:

SET "ToAdd=\\somewhere\Tools\strawberryperl\perl\site\bin;" 
SET "ToAdd=%ToAdd%;\\somewhere\Tools\strawberryperl\perl\bin;" 
SET "ToAdd=%ToAdd%;\\somewhere\Tools\strawberryperl\c\bin;" 
SET "ToAdd=%ToAdd%;\\somewhere\Tools\KDiff3" 
SET "PATH=%PATH%;%ToAdd%" 

顺便说一句,如果你希望添加到超越正在运行的会话环境变量那么你忽略的人建议你用的是很重要SETX而不是SET。 (该变量将被截断为1024字节,因此会对其进行破坏)。您的最佳解决方案将涉及编辑注册表,并可能使用内置工具(如PowerShell)。

编辑

这显示在我的评论中提到的方法,并使用相同的结构,脱线的回答是:

C:\ MYDIR \ Paths.txt

\\somewhere\Tools\strawberryperl\perl\site\bin 
\\somewhere\Tools\strawberryperl\perl\bin 
\\somewhere\Tools\strawberryperl\c\bin 
\\somewhere\Tools\KDiff3 

批处理文件

@Echo Off 
SetLocal EnableDelayedExpansion 
For /F "UseBackQDelims=" %%A In ("C:\MyDir\paths.txt") Do Set "Path=!Path!;%%~A" 
Echo(%Path% 
EndLocal 
Timeout -1 

这意味着你只需要每次都包含for循环而不是添加每个路径。

+0

这个解决方案很笨拙。 Iam充分意识到,这次修改是不适用于本次会议的。由于iam也使用setlocal,所以它更受限于批处理脚本的运行时间。 –

+0

它不像其他解决方案那样尴尬,这就是为什么每次打算使用这些工具时都必须创建它。在脚本编辑器中使用剪切和粘贴确实不会让文件变得更尴尬。我建议你做的是创建一个文件,其中包含要添加到变量中的行,然后每次解析该文件而不是重新创建代码,这将不那么笨拙。 – Compo

0

甚至没有远程防弹,但马古的回答提醒了我这一点。只是因为有人在什么地方,能找到这更好的用途构建

@echo off 
    setlocal enableextensions disabledelayedexpansion 

    for /f "delims=" %%a in ('echo "%path:;=" "%" 

     "\\somewhere\Tools\strawberryperl\perl\site\bin" 
     "\\somewhere\Tools\strawberryperl\perl\bin" 
     "\\somewhere\Tools\strawberryperl\c\bin" 
     "\\somewhere\Tools\KDiff3" 

    ""') do (set "path=%%~a") & call set "path=%%path:" "=;%%" 

    path