使用多行

时间:2016-12-01 11:26:20

标签: batch-file

在批处理文件中,我需要添加一些路径到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%

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

4 个答案:

答案 0 :(得分: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初始化为 nothing

答案 1 :(得分: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:;    =%"

答案 2 :(得分: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。

修改

这显示了我的评论中提到的方法,并使用与Magoo的答案相同的结构:

<强> 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循环,而不是将每个路径添加到它。

答案 3 :(得分:0)

甚至没有远程防弹,但Magoo的回答让我想起了这个。仅仅因为某个地方的人可以找到更好的用法来构建

@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