windows 批处理脚本在每个子文件夹中执行一些命令

4bbkushb  于 2023-06-30  发布在  Windows
关注(0)|答案(5)|浏览(204)

我需要写一个脚本在Windows中工作,当执行将运行在一些子目录的命令,但不幸的是,我从来没有做过任何批处理,我不知道从哪里开始。
以文件夹的结构为例:

\root
   \one
   \two
   \three
   \four

我希望脚本输入指定的文件夹(例如只有'one'和'four'),然后在这些文件夹的每个子目录中运行一些命令。
如果你能提供任何帮助,也许是一些基本的教程或只是我需要的命令的名称,我将非常感激。

v6ylcynt

v6ylcynt1#

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

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

直接在命令行上运行时使用百分号,从批处理运行时使用两个百分号
在一个批处理中,它看起来像这样:

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

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

for /f %i in (paths.lst) do call yourbatch %i

paths.lst看起来像这样:

C:\
D:\
Y:\
C:\foo

所有这些都是凭记忆写出来的,所以你可能需要加上一些引号;- )请注意,这将只处理第一级目录,这意味着没有选定子文件夹的子文件夹。

lzfw57am

lzfw57am2#

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

FOR /R "C:\SomePath\" %%F IN (.) DO (
    some command
)
nr7wwzry

nr7wwzry3#

我喜欢被定义为最佳答案的Marged的答案(我投了赞成票),但这个答案有很大的不便。
当DOS命令在(和)之间包含一些错误时,DOS返回的错误信息不是很明确。
作为参考,此消息是

) was unexpected at this time.

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

@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

FOR循环调用$DoSomething“方法”为每个目录找到传递DIR-NAME有一个参数。注意:双引号传递给$DoSomething方法中的%1参数。
exit /B命令用于指示方法的END,而不是脚本的END。
在我的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 . . .

警告:在Marged的答案中,当文件夹是相对文件夹(文件夹为。或..)。
为什么,因为脚本后藤第一个文件夹,当它在第一个文件夹中时,它请求从第一个文件夹转到第二个文件夹!

4dbbbstv

4dbbbstv4#

在Windows 10和更高版本上,应该是这样的:

@echo off
for /D %%G in ("C:\MyFolderToLookIn\*") DO ( 

echo %%~nxG

)

这将显示“C:\MyFolderToLookIn”中每个文件夹的名称。双引号是必需的。如果要显示文件夹的完整路径,请将echo %%~nxG更改为echo %%G

nlejzf6q

nlejzf6q5#

在BASH中,这是一种Unix shell,也可以下载用于Windows,我肯定会使用find来实现这一点

find . -mindepth 2 -maxdepth 2  -iregex ".*git.*\|.*out.*" -type d --exec echo {} \;

您可以根据自己的需要随意修改。

相关问题