如何在批处理中用FOR来循环执行几个命令?

时间:2022-09-02 23:52:46
FOR %%f IN (INI\*.BAT) DO (
 call %%f
 type %%f
 del V_TABLE  ;这是INI目录下的批处理所设置的环境变量
)
其中的%%f 是在INI目录下的几个批处理文件,这些文件都是对设置环境用的.
但是如上所写的话,在当前的批处理文件中无法访问INI目录下批处理文件所设置的环境变量.
上面是举个例子,实际要求是FOR循环中的命令必须对INI目录下的批处理文件所设定的环境变量进行操作.

23 个解决方案

#1


用GOTO语句

#2


不是开玩笑吧. goto 好象是跳转语句,不可能跳到另一个文件中吧.而且上面写的是顺序的,不需要有分支!

#3


up

#4


这帖子移到编程的版块去可能会好点哦

#5


把思路说详细点点,晚上来看,有事情要出去了。。。


嘿嘿

#6


不知語法是怎樣的,學習下!

#7


del V_TABLE  ;这是INI目录下的批处理所设置的环境变量
^^^^^^^^^^^^^^^^^^^^^^^^
这个明明就不是环境变量,你究竟要做什么?

#8


也不算是环境变量,只是我想在INI目录中的批处理文件中设置变量(我不大清楚关于批处理中有关变量的设置).类似于
set a=b 
set c=d
然后我要在FOR循环中对a和c的值进行处理,而且是要用多个命令对a 和 c 的值进行处理.
  现在的问题是如果在FOR中用()来包含循环体,那么在FOR的循环过程中,a和c无法取值.如果用 & 和 ^ 连接作为一条语句(我不大清楚是不是一条语句),无法进行循环,只有第一个文件能得到处理.
上面的 del 写错了.应该是del %V_TABLE%

#9


如果是用批处理,考虑在中间建立临时文件进行处理

思路这样:

echo SET A=b >_TMP.BAT
echo SET C=d >>_TMP.BAT
echo rem do something here...

call _TMP.BAT
sleep 1
del _TMP.BAT

.............
中间的处理可能要根据你的情况发生更多的变化

#10


我要做的是根据目录中的文件个数循环执行N条命令,就是目录里有多少个文件就要执行多少次循环,而且每次循环都要执行N条命令.而其中一条命令就是调用目录中的文件进行变量赋值(这些文件就是赋值用的).然后在剩余的命令中使用这些值.

#11


你可以不用在循环里面执行命令,可以考虑利用循环建立一个临时批处理文件,建立好以后,再执行这个临时批处理

#12


好象不成.INI目录下的每个文件都是对变量A和C进行赋值,只是值不同,然后在主批处理中对这些值进行统一的命令处理.

我原来的做法是每个文件都有一个完整的功能,但是所有的文件的功能都相同,只是部分变量所要改变罢了.我现在想做的就是把相同的东西抽取出来放在主批处理中,把不同的东西设置成变量放在同一目录下的不同子批处理文件中.然后在主批处理中进行对目录的循环,每CALL一个子批处理就进行一些命令处理.

#13


假设两个批处理:

a.bat
^^^^^^^^
@echo off
set a=c
set b=d
call b.bat
------------
b.bat
^^^^^^^^^^
@echo off
echo %a%
echo %b%

结果是b.bat可以处理a.bat里面的环境变量的,不知道你要如何操作?

#14


反了,是这样的.
a.bat
^^^^^^^^
@echo off
FOR %%f IN (INI\*.BAT) DO (
 call %%f    ;这个就是call b.bat,只是b.bat名字不是固定的,
 echo %a%    ;这样写的话,这里取不到a和b的值
 echo %b%
)
------------
b.bat
^^^^^^^^^^
@echo off
set a=c
set b=d

#15


?我这里也可以啊


c.bat
^^^^
@echo off
call b.bat
echo a = %a%
echo b = %b%
----------

b.bat
^^^^^^^^^^
@echo off
set a=c
set b=d

#16


可是放在FOR循环的括号里就不可以了...

#17


你看过FOR运行的结果吗?
==========================
C:\>e

C:\>FOR %f IN (INI\*.BAT) DO (
call %f
 echo a= "the d.bat"
 echo b= "THE D.BAT"
 sleep 1
)

C:\>(
call INI\c.bat
 echo a= "the d.bat"
 echo b= "THE D.BAT"
 sleep 1
)

C:\>echo call c.bat
call c.bat

C:\>set a=c

C:\>set b=d

C:\>rem call d.bat
a= "the d.bat"
b= "THE D.BAT"

C:\>(
call INI\d.bat
 echo a= "the d.bat"
 echo b= "THE D.BAT"
 sleep 1
)

C:\>echo call d.bat
call d.bat

C:\>set a="the d.bat"

C:\>set b="THE D.BAT"

C:\>rem call d.bat
a= "the d.bat"
b= "THE D.BAT"

C:\>
%%%%%%%%%%%%%%%%%%%%
单独运行的时候的确可以,但是如果有多个.bat的时候,环境变量成了最后一个执行的那个了。这就是说,你的思路是不可行的,因为电脑不允许这么操作

#18


我看过的.在BAT运行的时候,我看到的是子批处理文件中的变量有执行,并且变量也值在环境中,但是在FOR的循环内却访问不到.运行结束后再看一下环境变量,所设定的值都在.
可能FOR真不允许这么用吧!

#19


谢谢你的答复,我还是另想办法吧.

#20


不,你看到没有,变量在第一个运行的时候已经变了,不再是变量了,成了常量。


C:\>e

C:\>FOR %f IN (INI\*.BAT) DO (
call %f
 echo a= "the d.bat" <--------------
 echo b= "THE D.BAT"
 sleep 1
)

……………………
这里。。。。
原句是:echo a=%a%

可是执行过后,%a%,已经不存在了,所以每个循环也不能改变

#21


你用的是什么系统,我的是2000Server,我运行的结果和你的不一样....我显示的运行过程
 echo a= "the d.bat" 
 echo b= "THE D.BAT"
这里一直都是空的.
 echo a=
 echo b=
还有就是sleep是干什么用的,看名字好象是暂停一段时间,可是我的系统不支持这个命令!

#22


我一样的win2k with last service pack + all hotfixes

sleep是resource kit里面的

#23


奇怪了,不同的机器竟有不同的结果。我还是用别的吧。这样兼容性可不好。
谢谢。。。
可是怎么结贴啊。我给分的时候它老说加复数大于给分数.

#1


用GOTO语句

#2


不是开玩笑吧. goto 好象是跳转语句,不可能跳到另一个文件中吧.而且上面写的是顺序的,不需要有分支!

#3


up

#4


这帖子移到编程的版块去可能会好点哦

#5


把思路说详细点点,晚上来看,有事情要出去了。。。


嘿嘿

#6


不知語法是怎樣的,學習下!

#7


del V_TABLE  ;这是INI目录下的批处理所设置的环境变量
^^^^^^^^^^^^^^^^^^^^^^^^
这个明明就不是环境变量,你究竟要做什么?

#8


也不算是环境变量,只是我想在INI目录中的批处理文件中设置变量(我不大清楚关于批处理中有关变量的设置).类似于
set a=b 
set c=d
然后我要在FOR循环中对a和c的值进行处理,而且是要用多个命令对a 和 c 的值进行处理.
  现在的问题是如果在FOR中用()来包含循环体,那么在FOR的循环过程中,a和c无法取值.如果用 & 和 ^ 连接作为一条语句(我不大清楚是不是一条语句),无法进行循环,只有第一个文件能得到处理.
上面的 del 写错了.应该是del %V_TABLE%

#9


如果是用批处理,考虑在中间建立临时文件进行处理

思路这样:

echo SET A=b >_TMP.BAT
echo SET C=d >>_TMP.BAT
echo rem do something here...

call _TMP.BAT
sleep 1
del _TMP.BAT

.............
中间的处理可能要根据你的情况发生更多的变化

#10


我要做的是根据目录中的文件个数循环执行N条命令,就是目录里有多少个文件就要执行多少次循环,而且每次循环都要执行N条命令.而其中一条命令就是调用目录中的文件进行变量赋值(这些文件就是赋值用的).然后在剩余的命令中使用这些值.

#11


你可以不用在循环里面执行命令,可以考虑利用循环建立一个临时批处理文件,建立好以后,再执行这个临时批处理

#12


好象不成.INI目录下的每个文件都是对变量A和C进行赋值,只是值不同,然后在主批处理中对这些值进行统一的命令处理.

我原来的做法是每个文件都有一个完整的功能,但是所有的文件的功能都相同,只是部分变量所要改变罢了.我现在想做的就是把相同的东西抽取出来放在主批处理中,把不同的东西设置成变量放在同一目录下的不同子批处理文件中.然后在主批处理中进行对目录的循环,每CALL一个子批处理就进行一些命令处理.

#13


假设两个批处理:

a.bat
^^^^^^^^
@echo off
set a=c
set b=d
call b.bat
------------
b.bat
^^^^^^^^^^
@echo off
echo %a%
echo %b%

结果是b.bat可以处理a.bat里面的环境变量的,不知道你要如何操作?

#14


反了,是这样的.
a.bat
^^^^^^^^
@echo off
FOR %%f IN (INI\*.BAT) DO (
 call %%f    ;这个就是call b.bat,只是b.bat名字不是固定的,
 echo %a%    ;这样写的话,这里取不到a和b的值
 echo %b%
)
------------
b.bat
^^^^^^^^^^
@echo off
set a=c
set b=d

#15


?我这里也可以啊


c.bat
^^^^
@echo off
call b.bat
echo a = %a%
echo b = %b%
----------

b.bat
^^^^^^^^^^
@echo off
set a=c
set b=d

#16


可是放在FOR循环的括号里就不可以了...

#17


你看过FOR运行的结果吗?
==========================
C:\>e

C:\>FOR %f IN (INI\*.BAT) DO (
call %f
 echo a= "the d.bat"
 echo b= "THE D.BAT"
 sleep 1
)

C:\>(
call INI\c.bat
 echo a= "the d.bat"
 echo b= "THE D.BAT"
 sleep 1
)

C:\>echo call c.bat
call c.bat

C:\>set a=c

C:\>set b=d

C:\>rem call d.bat
a= "the d.bat"
b= "THE D.BAT"

C:\>(
call INI\d.bat
 echo a= "the d.bat"
 echo b= "THE D.BAT"
 sleep 1
)

C:\>echo call d.bat
call d.bat

C:\>set a="the d.bat"

C:\>set b="THE D.BAT"

C:\>rem call d.bat
a= "the d.bat"
b= "THE D.BAT"

C:\>
%%%%%%%%%%%%%%%%%%%%
单独运行的时候的确可以,但是如果有多个.bat的时候,环境变量成了最后一个执行的那个了。这就是说,你的思路是不可行的,因为电脑不允许这么操作

#18


我看过的.在BAT运行的时候,我看到的是子批处理文件中的变量有执行,并且变量也值在环境中,但是在FOR的循环内却访问不到.运行结束后再看一下环境变量,所设定的值都在.
可能FOR真不允许这么用吧!

#19


谢谢你的答复,我还是另想办法吧.

#20


不,你看到没有,变量在第一个运行的时候已经变了,不再是变量了,成了常量。


C:\>e

C:\>FOR %f IN (INI\*.BAT) DO (
call %f
 echo a= "the d.bat" <--------------
 echo b= "THE D.BAT"
 sleep 1
)

……………………
这里。。。。
原句是:echo a=%a%

可是执行过后,%a%,已经不存在了,所以每个循环也不能改变

#21


你用的是什么系统,我的是2000Server,我运行的结果和你的不一样....我显示的运行过程
 echo a= "the d.bat" 
 echo b= "THE D.BAT"
这里一直都是空的.
 echo a=
 echo b=
还有就是sleep是干什么用的,看名字好象是暂停一段时间,可是我的系统不支持这个命令!

#22


我一样的win2k with last service pack + all hotfixes

sleep是resource kit里面的

#23


奇怪了,不同的机器竟有不同的结果。我还是用别的吧。这样兼容性可不好。
谢谢。。。
可是怎么结贴啊。我给分的时候它老说加复数大于给分数.