将目录和子目录添加到Path变量

时间:2018-02-15 01:32:24

标签: windows batch-file windows-7-x64

我有一个包含许多子目录的目录,在每个子目录中我都有可执行文件。我将它们放在不同的子目录中以保持它们的有序性。

我希望能够从CMD调用目录中的每个子目录中的每个可执行文件(已经添加到系统路径变量中)。在我的搜索中,我从SuperUser中看到了以下脚本:

setlocal EnableDelayedExpansion
cd /D %~dp0

for /R %%G in (".") do (
    set "_dir=!dir!;%%G"
)

path=%path%!dir!
(endlocal
    set "ret=%PATH%"
)
cmd /K "title [#] Path Fixed [#] && path %ret%"
exit /B

理论上,我应该能够将该脚本放在目录中,在CMD中调用脚本并能够调用目录/子目录中的任何可执行文件,但它在Windows 7和Windows 10中都不起作用。

如果你们中的任何人可以帮我修复剧本,或者如果你有更好的剧本,我会非常感激!

2 个答案:

答案 0 :(得分:0)

这只添加了包含可执行内容的目录,路径变量,设置控制台窗口标题,并使用您启动它的任何参数启动cmd / k。退出子项时,将还原整个环境和控制台标题。

@setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
@rem @set prompt=$G

@rem If we have any arguements, we'll pass them along to the child cmd instance.
@set _childCmd=%*

@rem Add any executable extensions you have mapped on your system that aren't
@rem listed in your PATHEXT variable.
@rem On my Win10, PATHEXT has: .COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
set _executables=*.ps *.py

@rem Add PATHEXT contents, replacing semicolons with spaces and dots with *.
set _tmp=%PATHEXT:;= %
set _tmp=%_tmp:.=*.%
set _executables=%_executables% %_tmp%

@rem It's ok if the caller clears the path first.
@set _path=%path%
@rem Find all the executables in and below the current directory and add to path.
@for /f %%G in ('dir /b /s %_executables%') do @call :AddToPathOnlyOnce "%%~dpG"
@set "path=%_path%"

@rem Clean-up a bit before launching into new cmd instance.
@set _path=
@set _tmp=
@set _executables=

@rem Set title and launch new instance.
@title Command Prompt (extended path)
@setlocal ENABLEEXTENSIONS DISABLEDELAYEDEXPANSION
@set _childCmd=& @call cmd.exe /K %_childCmd%
@endlocal

@rem Title is not recovered on endlocal, so restore it before exiting script.
@title Command Prompt
@endlocal
@exit /b 0

:AddToPathOnlyOnce
@set _tmp=%~1
@if not defined _path (@set "_path=%_tmp%" & @exit /b 0)
@rem If it's already in the path, remove it and then add to the end.
@set "_path=!_path:%_tmp%=!"
@set "_path=%_path:;;=%"
@set "_path=%_path%;%_tmp%"
@exit /b 0

我总是在任何地方使用@前缀,除了我正在调试的行,而不是在脚本中设置echo off,因为它与其他脚本不能很好地组合。在这种情况下,无论如何切换到子实例时都需要调用者设置。

如果您因任何原因需要调试此脚本,请从rem行中删除@rem @set prompt=$G语句。

请注意,脚本中的任何位置都没有多行块(我总是尽可能避免使用它们),但我们仍然需要EnableDelayedExpansion命令中的set

答案 1 :(得分:0)

setlocal EnableDelayedExpansion
cd /D %~dp0

for /R %%G in (".") do (
    set "_dir=!dir!;%%G"
)

SET path=%path%!dir!
(endlocal
    set "ret=%PATH%"
)
cmd /K "title [#] Path Fixed [#] && SET path=%ret%"
exit /B
我相信,

应该有效(我还没有使用cmd /k 20多年的NT风格批处理工作)