我有一个包含许多子目录的目录,在每个子目录中我都有可执行文件。我将它们放在不同的子目录中以保持它们的有序性。
我希望能够从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中都不起作用。
如果你们中的任何人可以帮我修复剧本,或者如果你有更好的剧本,我会非常感激!
答案 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风格批处理工作)