用于在每个子文件夹中执行某些命令的批处理脚本

Kac*_*per 23 windows batch-file

我需要编写一个在Windows中工作的脚本,执行时会在某些子目录中运行命令,但遗憾的是我从未做过任何批处理,我不知道从哪里开始.

使用文件夹的示例结构:

\root
   \one
   \two
   \three
   \four
Run Code Online (Sandbox Code Playgroud)

我希望脚本输入指定的文件夹(例如只有'one'和'four'),然后在该文件夹的每个子目录中运行一些命令.

如果您可以提供任何帮助,可能是一些基本教程或仅仅是我需要的命令的名称,我将非常感激.

Mar*_*ged 45

您可以告诉批处理迭代目录:

for /d %i in (C:\temp\*) do ( cd "%i" &  *enter your command here* ) 
Run Code Online (Sandbox Code Playgroud)

直接在命令行上运行时使用百分号,从批处理运行时使用两个百分号

在批处理中,这看起来像这样:

@echo off
set back=%cd%
for /d %%i in (C:\temp\*) do (
cd "%%i"
echo current directory:
cd
pause
)
cd %back%
Run Code Online (Sandbox Code Playgroud)

将所需的命令放在(和之间的行中).如果替换C:\temp\%1您可以告诉批处理在调用时从第一个参数中获取目录的值.根据目录的数量,您可以为每个目录调用批处理,也可以从列表中读取它们:

for /f %i in (paths.lst) do call yourbatch %i
Run Code Online (Sandbox Code Playgroud)

paths.lst会是这样的:

C:\
D:\
Y:\
C:\foo
Run Code Online (Sandbox Code Playgroud)

所有这些都是从内存中写的,所以你可能需要添加一些引号;-)请注意,这只会处理第一级目录,这意味着没有所选子文件夹的子文件夹.


Mic*_*elS 5

你应该看看这个。您要查找的命令是FOR /R。看起来像这样:

FOR /R "C:\SomePath\" %%F IN (.) DO (
    some command
)
Run Code Online (Sandbox Code Playgroud)


sch*_*ebe 5

我喜欢Marged那个被定义为最佳答案的答案(我投票赞成),但是这个答案有很大的不便。

当 ( 和 ) 之间的 DOS 命令包含一些错误时, DOS 返回的错误信息不是很明确。

有关信息,此消息是

) was unexpected at this time.
Run Code Online (Sandbox Code Playgroud)

为了避免这种情况,我提出以下解决方案:

@echo off

pushd .
for /d %%i in (.\WorkingTime\*.txt) do call :$DoSomething "%%i"
popd

pause
exit /B

::**************************************************
:$DoSomething
::**************************************************

echo current directory: %1
cd %1
echo current directory: %cd%
cd ..

exit /B
Run Code Online (Sandbox Code Playgroud)

FOR 循环调用 $DoSomething “方法”为找到的每个目录传递 DIR-NAME 都有一个参数。注意:在 $DoSomething 方法中将双引号传递给 %1 参数。

exit /B 命令用于指示方法的结束而不是脚本的结束。

在我的 PC 上,我在 c:\Temp 文件夹中有 2 个文件夹的结果是

D:\@Atos\Prestations>call test.bat
current directory: ".\New folder"
current directory: D:\@Atos\Prestations\New folder
current directory: ".\WorkingTime"
current directory: D:\@Atos\Prestations\WorkingTime
Press any key to continue . . .
Run Code Online (Sandbox Code Playgroud)

注意:在Margeds 答案中,当文件夹是相对的(带有 . 或 .. 的文件夹)时,cd "%%i" 的使用是不正确的。

为什么,因为脚本转到第一个文件夹,当它在第一个文件夹中时,它请求从第一个文件夹转到第二个文件夹!