如何编写批处理文件以将每一项(从外部文件读取的目录列表)附加到 PATH?

如何编写批处理文件以将每一项(从外部文件读取的目录列表)附加到 PATH?

我如何翻译批处理文件

rem working batchA.bat
PATH=%PATH%;C:\Program Files\gs\gs9.07\bin
PATH=%PATH%;C:\Program Files (x86)\Adobe\Reader 11.0\Reader
PATH=%PATH%;C:\Program Files (x86)\Google\Chrome\Application
PATH=%PATH%;C:\Program Files (x86)\cwRsync\bin
PATH=%PATH%;C:\Program Files (x86)\PDF Labs\PDFtk Server\bin

setx PATH "%PATH%" /m

rem NOT working batchB.bat
for /f "delims=" %%x in (List.txt) do (PATH=%PATH%;%%x)
setx PATH "%PATH%" /m

其中List.txt包含以下内容。

C:\Program Files\gs\gs9.07\bin
C:\Program Files (x86)\Adobe\Reader 11.0\Reader
C:\Program Files (x86)\Google\Chrome\Application
C:\Program Files (x86)\cwRsync\bin
C:\Program Files (x86)\PDF Labs\PDFtk Server\bin

答案1

您遇到的问题是变量在 FOR 行上仅扩展一次,因此当您循环时,%PATH% 不再是一个变量。

for /f "delims=" %%x in (List.txt) do (PATH=%PATH%;%%x)

在循环运行之前就变成这样:

for /f "delims=" %%x in (List.txt) do (PATH=C:\Windows;Blah;Blah;%%x)

您可以使用延迟扩展来解决这个问题,正如 Karan 所说,但我从来没有成功过。在使用 for 循环时,我总是建议使用函数。

for /f "tokens=*" %%x in (List.txt) do call:loadpath "%%x"
setx PATH "%PATH%" /m

Exit /b 0

REM -------------------------

:loadpath
SET PATH=%PATH%;%~1
Exit /b 0

注意:使用“tokens=*”从文件中获取整行。调用函数将每个单词放在 %1 中时,使用双引号“%%x”。在函数中使用 %~1 从值中删除双引号。

答案2

我已经尝试了所有我能想到的方法来实现你想要的效果,但却不断遇到你已经看到过的障碍。

有几个选项使用起来不是那么好,但仍然可以完成工作:

1. 在一台机器上设置变量,导出它们并在另一台机器上重复使用它们。

改编自如何从文件内容设置环境变量?

在已经设置路径的机器上,运行:

echo %PATH%> dat

这将创建一个名为 dat 的文件,其中包含参考机器的完整路径。

然后,您可以通过将其传递到命令中,在另一台机器上重新应用它们:

set /P PATH=< dat

应该可以进行编辑dat,使其仅包含您想要附加到机器的路径,并像这样修改命令:

set /P PATH=%path%;< dat

请注意,我还没有测试过这个修改。

今后您可以添加任何更改dat

2.使用第三方应用程序 pathed.exe

使用来自的信息在 Windows 中轻松编辑 PATH 环境变量

使用已路径, 的一部分工具,您可以附加路径。

假设您的列表是 List.txt 并且您与列表位于同一目录中,则命令将如下所示:

for /f "delims=" %%x in (List.txt) do (pathed /append %%x /machine)

您还需要在您的路径中或您正在工作的同一目录中找到路径。

2.使用 PowerShell

您也可以研究 PowerShell,但是您已经表明这不是一个选项(加上选项 1 或 2 应该能够看到您的正确选择。)

答案3

尝试一下这个:

setlocal enabledelayedexpansion
for /f "delims=" %%x in (List.txt) do (PATH=!PATH!;%%x)
setx PATH "!PATH!" /m

相关内容