湖南工业大学办公电话:批处理的问题

来源:百度文库 编辑:杭州交通信息网 时间:2024/05/11 03:09:30
目的: 显示当前目录的所有文件。

这样是对的:
@for %%i in (*) do @(
@echo %%i
)

这样就是错的:
@for %%i in (*) do @(
@set MYTEMP=%%i
@echo %MYTEMP%
)

这是为什么?
答"天下无敌":
你修改后的执行结果和没有修改的执行结果是相同的,与&&没有什么关系.
我是想知道为什么MYTEMP只取最后一个值,有没有办法让它每次取不同的值?

连接两条命令要使用"&"或"&&"
你的程序要改成
@for %%i in (*) do @(
@set MYTEMP=%%i && @echo %MYTEMP%
)
这样就不会有错误
但这么多@和换行没必要吧

但是
我想你的目的没有达到
这样你得到全是一样的文件
一个文件输出了好多行而已
而这个文件是排列在最后的文件
每次的set都使MYTEMP有一个新值
但是for命令只是取最后一个

想知道怎么显示全部我再解释吧
现在还有些事情
不好意思

(以下内容在7月7日添加)
下面我解释下MYTEMP的值的问题
官方帮助有些说明
但是讲得不是很清楚
主要是一个“延迟环境变量”的问题
当起用这个变量时可以使用!var!代替%var%
这样的变量可以被扩充多次
举个例子先
在命令行下输
set var=100
先给个初值
然后
for /L %i in (1,1,10) do @(set var=%i && echo %var%)
我们的本意是输出一到十这十个数
但是真实的输出是十个一百
然后再运行这一句
for /L %i in (1,1,10) do @(set var=%i && echo %var%)
得到十个十
我们得到的启发是
echo %var%在for循环开始前就换成了对应的值
第一次是100
虽然为var多次赋值
但是 %var % 已经被100代替
最后var确实是10了
但是并没有输出来
在第二次同样的道理
var 开始时就被上一步的10代替
循环基本没有意义

当然这个问题是可以解决的
那就是起用“延迟环境变量”
起用的方法有两个
一是命令:
setlocal EnableDelayedExpansion
这种修改一直保留到批处理结束或遇到endlocal命令为止
在批处理中推荐使用这种方法
二是起用新的cmd实例
cmd /v:on
这样启动的新的实例支持“延迟环境变量”
只到遇到exit命令退出当前实例
返回上一级命令行为止
在命令行下直接操作要采用这种方法

起用了延迟变量后
就可以使用!var!形式的变量了
举个例子 (直接在命令行下操作)
先一句
cmd /v:on
然后
for /L %i in (1,1,10) do @(set var=%i && echo !var!)
这样的话你就会看到输出了一到十这十个数

在批处理中
一般的格式是这样的(参考你的问题)
@echo off
setlocal EnableDelayedExpansion
for %%i in (*) do @(set MYTEMP=%%i && echo !MYTEMP!)
这样运行你就看到了不止一个文件了吧