![如何编写批处理文件以将每一项(从外部文件读取的目录列表)附加到 PATH?](https://linux22.com/image/1354816/%E5%A6%82%E4%BD%95%E7%BC%96%E5%86%99%E6%89%B9%E5%A4%84%E7%90%86%E6%96%87%E4%BB%B6%E4%BB%A5%E5%B0%86%E6%AF%8F%E4%B8%80%E9%A1%B9%EF%BC%88%E4%BB%8E%E5%A4%96%E9%83%A8%E6%96%87%E4%BB%B6%E8%AF%BB%E5%8F%96%E7%9A%84%E7%9B%AE%E5%BD%95%E5%88%97%E8%A1%A8%EF%BC%89%E9%99%84%E5%8A%A0%E5%88%B0%20PATH%EF%BC%9F.png)
我如何翻译批处理文件
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