我需要编写一个在Windows中运行的脚本,执行时会在某些子目录中运行命令,但不幸的是我从未做过任何批处理,我不知道从哪里开始。
使用文件夹的示例结构:
\root
\one
\two
\three
\four
我希望脚本输入指定的文件夹(例如只有'one'和'four'),然后在该文件夹的每个子目录中运行一些命令。
如果您可以提供任何帮助,可能是一些基本教程或我需要的命令名称,我将非常感激。
答案 0 :(得分:30)
您可以告诉批处理迭代目录:
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
所有这些都是从内存中写的,所以你可能需要添加一些引号;-) 请注意,这只会处理第一级目录,这意味着没有所选子文件夹的子文件夹。
答案 1 :(得分:3)
你应该看看this。您要查找的命令是FOR /R
。看起来像这样:
FOR /R "C:\SomePath\" %%F IN (.) DO (
some command
)
答案 2 :(得分:1)
我喜欢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
对于通过DIR-NAME找到的每个目录,FOR循环调用$ DoSomething“ method”都有一个参数。注意:在$ 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 . . .
警告:在Marged
的答案中,当文件夹是相对文件夹(带有。或..的文件夹)时,cd“ %% i”的用法不正确。
为什么,因为脚本转到第一个文件夹,并且该脚本位于第一个文件夹中,所以它请求从第一个文件夹转到第二个文件夹!
答案 3 :(得分:0)
如果每个文件夹中都有* .cmd或* .bat文件(需要从该子文件夹执行),则可以在根文件夹中创建cmd文件,其中包含以下内容:
For /R .\ %%a IN (*script_to_execute.cmd) do (
cd "%%~da%%~pa"
%%a)
或
For /R .\ %%a IN (*download.cmd) do (
echo "%%a"
echo "%%~da%%~pa"
cd "%%~da%%~pa"
%%a)
我需要从youtube下载多个播放列表时使用它。每个文件夹都包含用于下载特定播放列表的cmd文件。由于下载脚本会将视频下载到从中调用的文件夹,因此我需要先更改分叉目录。
答案 4 :(得分:0)
在Windows 10及更高版本上,应该是这样的:
@echo off
for /D %%G in ("C:\MyFolderToLookIn\*") DO (
echo %%~nxG
)
这将显示“ C:\ MyFolderToLookIn”中每个文件夹的名称。必须使用双引号。 如果要显示文件夹的完整路径,请用 echo %% G
更改 echo %%〜nxG