迭代目录和子目录的列表,以在Windows中的每个目录下运行特定命令

时间:2019-02-15 00:37:51

标签: batch-file iterator

我有一个包含几个子文件夹的父文件夹。我正在尝试运行在子文件夹下运行特定操作的bat脚本。但是,我不希望脚本在所有子文件夹中运行。我需要从列表中排除一些。这就是我现在拥有的:

t=[1 2 3 4 5 6 7 8 9 10];
y=[1,-2,2,-1,6,-5,1,-1,8,-5];
pp = interp1(t,y,'spline','pp');
slopes1=ppval(pp_der,t);

pushd for /D %%i in (<<path To Parent>>\*) do call :$myFunc "%%i" popd exit /B :$myFunc for %%g in ("Child2" "Child3") do ( if /I "%1"=="%%~g" goto match ) echo current directory: %1 exit /B :$match echo matched directory exit /B 子例程中,我可以执行:$myFunc进入该子目录并运行命令,然后执行cd %1返回到父文件夹。我之前尝试做的一件事是,如果传入文件夹在我的排除列表中,则排除cd操作。

文件夹树:

:$myFunc

鉴于上面的示例文件夹结构,当for选择ParentFolder Child1 Child2 Child3 Child4 myFunc时,如何不调用Child2

关于如何实现此目标的任何建议?

1 个答案:

答案 0 :(得分:2)

这肯定是可能的,并且可以通过以下代码(很多更改)来完成:

@echo off
setlocal EnableDelayedExpansion

rem Set which folders to exclude. This is changeable and NOT HARDCODED:
set exclude_folders="Child2" "Child3"

for /F %%A IN ('dir /B /AD "<path to parent>"') do (
    if "!exclude_folders:%%~nxA=!" == "%exclude_folders%" (call :$myFunc "%%A" "%%~fA")
)
exit /b %errorlevel%


:$myFunc
pushd "%~2"
rem Do your commands here; don't use pushd again!
popd

请注意,如果第一个参数位于%cd%中,则为文件夹名称。否则,这是完整的路径。第二个参数是可选的,更笼统,但是我确定您会需要它!

我将代码更改如下:

  • 创建了一个名为exclude_folders的变量,以在此处列出要执行的文件夹。
  • 创建了一个for /F循环来循环命令,(dir /B /AD)循环了所有文件夹,避免隐藏文件夹!
  • 如果%%~nxA和变量中排除了由于文件夹可能包含点(%%~nxA而使用的文件夹名(.)[使用exclude_folders更改(换句话说,如果foldername中存在字符串exclude_folders,则表示该文件夹已被列入黑名单,并且for循环将从下一行开始,因为没有else的命令。如果情况相反,则call子例程$myFunc带有两个参数:%%A%%~fA
  • %~2文件夹中执行一些命令,然后返回到循环。
  • 循环完成后,脚本将exit