中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » 论坛回收站 » 继续再来一个for的问题(更改了,主要问题在3楼)
作者:
标题: 继续再来一个for的问题(更改了,主要问题在3楼) 上一主题 | 下一主题
wwx0423
初级用户





积分 33
发帖 30
注册 2009-2-19
状态 离线
『楼 主』:  继续再来一个for的问题(更改了,主要问题在3楼)

我有一个文本, 里面全是计算机名,一行一个计算机名
能否使用 for 来 一次提取一个计算机 然后将这个计算机映射到本地磁盘?
比如。。。  
pcname.txt 的内容是
pcname1
pcname2
pcname3
现在我想做网络映射,  \\pcname1\c$\windows\system32\
完成 映射后需要判断它是否映射成功, 如果成功就继续执行 其他指令, 如果不成功就将该计算机记录到 另一个  故障.txt 的文本中。



主要问题在 3楼

[ Last edited by wwx0423 on 2009-6-24 at 06:25 ]

2009-6-24 04:37
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
chenall
银牌会员




积分 1276
发帖 469
注册 2002-12-23
来自 福建泉州
状态 离线
『第 2 楼』:  

自己学习一下FOR的用法
在CMD下
for /?
例子
for /f %%i in (pcname.txt) do (
    net use \\%%i\c$\windows\system32\ || echo %%i>>故障.txt
)

|| 的作用就是当前面的语句执行失败时就执行后面的语句.
&& 反之
& 不论如何都执行.

这些都可以在CMD的帮助中学到.

[ Last edited by chenall on 2009-6-24 at 04:44 ]



QQ:366840202
http://chenall.net
2009-6-24 04:42
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (366840202)  编辑帖子  回复  引用回复
wwx0423
初级用户





积分 33
发帖 30
注册 2009-2-19
状态 离线
『第 3 楼』:  

do 之后如果有指令集是不是 () 括起来。 我使用过  /?查看,但是帮助写的不是很详细。 看的不太懂。
我想要实现的功能是,  从 一个文本里 读取 计算机名,然后做映射, 如果映射不成功就把该计算机名记录下来。如果映射成功 则 判断该 计算机的 hots文件大小,如果大小不等于我要的大小,也把该计算机名记录下来,如果hots文件的大小等于我要的大小则不记录.断开映射, 继续重新读取下一个计算机名。 之前你有教过我怎么去hots的文件大小。
但是 现在 映射的成功和失败判定? 和 让for读一个计算机名后执行完需要的命令后再去读第二个计算机名, 好像for /f 他是全部读取完 再执行吧?

[ Last edited by wwx0423 on 2009-6-24 at 06:25 ]

2009-6-24 04:59
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
wwx0423
初级用户





积分 33
发帖 30
注册 2009-2-19
状态 离线
『第 4 楼』:  

用 if  和 for 一起使用 最好了。
但是if 和for 的使用 和变量 都不会 ,刚刚才从你那得知 %i和 %%i 在cmd和批处理中的区别。

2009-6-24 05:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
wwx0423
初级用户





积分 33
发帖 30
注册 2009-2-19
状态 离线
『第 5 楼』:  

chenall 在吗? 你能上一下QQ吗?

2009-6-24 05:13
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Hanyeguxing
银牌会员

正在学习中的菜鸟...


积分 1039
发帖 897
注册 2009-3-1
来自 在地狱中仰望天堂
状态 离线
『第 6 楼』:  

如果你很想用if ,可以使用语法if [not] errorlevel number command [else expression]



批处理之家 http://bbs.bathome.net/forum-5-1.html
2009-6-24 05:29
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
wwx0423
初级用户





积分 33
发帖 30
注册 2009-2-19
状态 离线
『第 7 楼』:  

不用 if 能做到 我想要实现的功能吗?
当当只用for 能实现? 
好几个判断的地方。 判断 是否映射成功, 判断文件大小是否等于我要的值。

2009-6-24 06:06
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Hanyeguxing
银牌会员

正在学习中的菜鸟...


积分 1039
发帖 897
注册 2009-3-1
来自 在地狱中仰望天堂
状态 离线
『第 8 楼』:  

你在1楼有说要判断文件大小吗?自己看帮助吧



批处理之家 http://bbs.bathome.net/forum-5-1.html
2009-6-24 06:22
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
wwx0423
初级用户





积分 33
发帖 30
注册 2009-2-19
状态 离线
『第 9 楼』:  

主要的问题在3楼呀。 

2009-6-24 06:23
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
chenall
银牌会员




积分 1276
发帖 469
注册 2002-12-23
来自 福建泉州
状态 离线
『第 10 楼』:  

不知是不是没有注意看贴,我上面已经有例子了.
net use \xxx\xx || 失败执行.
net use \xxx\xx && 成功时执行.

for 虽然是全部读取,但也是一行一行来执行的.

可以考虑不在for 里面来完成所有功能.而把需要做的事放在一个模块里面.
首先获取HOSTS文件的大小
for %%i in (c:\windows\system32\drivers\etc\hosts) set hosts=%%~zi
for /f %%i in (pcname.txt) do call :检测 %%i
goto :eof

:检测
if "%~1"=="" goto :eof
net use \\%~1\c$\windows\system32\ || (echo %~1>>故障.txt&&goto :eof)
for %%i in (\\%~1\c$\windows\system32\drivers\etc\hosts) do (
    if  not "%%~zi"=="%hosts%" echo %~1>>失败.txt
)
goto :eof

   此帖被 +2 点积分    点击查看详情   
评分人:【 Hanyeguxing 分数: +2  时间:2009-6-24 07:38




QQ:366840202
http://chenall.net
2009-6-24 07:15
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (366840202)  编辑帖子  回复  引用回复
wwx0423
初级用户





积分 33
发帖 30
注册 2009-2-19
状态 离线
『第 11 楼』:  

看不懂你写的。
for %%i in (c:\windows\system32\drivers\etc\hosts) set hosts=%%~zi
for /f %%i in (pcname.txt) do call :检测 %%i
goto :eof

:检测
if "%~1"=="" goto :eof
net use \\%~1\c$\windows\system32\ || (echo %~1>>故障.txt&&goto :eof)
for %%i in (\\%~1\c$\windows\system32\drivers\etc\hosts) do (
    if  not "%%~zi"=="%hosts%" echo %~1>>失败.txt
)
goto :eof

其中 %~1 那里来的?  还与我要检测是的 映射的计算机的HOTS,如列表里有计算机名分别是  
pc1
pc2
pc3
那么我要检测的是 pc1的 hots 和pc2的hots……没先映射怎么检测呀?

[ Last edited by wwx0423 on 2009-6-24 at 07:24 ]

2009-6-24 07:23
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Hanyeguxing
银牌会员

正在学习中的菜鸟...


积分 1039
发帖 897
注册 2009-3-1
来自 在地狱中仰望天堂
状态 离线
『第 12 楼』:  

for %%i in (c:\windows\system32\drivers\etc\hosts) set hosts=%%~zi
::扩展本地计算机的host 文件大小并作为比照基础
for /f %%i in (pcname.txt) do call :检测 %%i
::解析pcname.txt并call标签,同时将变量%%i带入到子标签
goto :eof

:检测
if "%~1"=="" goto :eof
::判断变量%%i(从上面call带进来的那个,也就是第一个,%~1是用来扩展去掉引号的)是否为空
net use \\%~1\c$\windows\system32\ || (echo %~1>>故障.txt&&goto :eof)
::尝试建立连接,如果失败则输出%%i
for %%i in (\\%~1\c$\windows\system32\drivers\etc\hosts) do (
    if  not "%%~zi"=="%hosts%" echo %~1>>失败.txt
)
::扩展远程host的大小,并与本地计算机的host大小比较
goto :eof

%~1的问题参考批处理变量的扩展及命令call的使用

[ Last edited by Hanyeguxing on 2009-6-24 at 07:37 ]



批处理之家 http://bbs.bathome.net/forum-5-1.html
2009-6-24 07:32
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
chenall
银牌会员




积分 1276
发帖 469
注册 2002-12-23
来自 福建泉州
状态 离线
『第 13 楼』:  

多谢楼上的解释,

楼主如果真想学好批处理.
应该好好看一下CMD命令的帮助,善用 /?
里面一般都有例子.试一次可能看不出来有什么作用,那就多试几次.

我从DOS的命令开始学起的,当时网络还不是很发达,都是一条命令/?然后一个一个参数加上去尝试的.

现在网络很方便.而且CMD的帮助都是中文的,应该学起来也比较快.



QQ:366840202
http://chenall.net
2009-6-24 07:36
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (366840202)  编辑帖子  回复  引用回复
wwx0423
初级用户





积分 33
发帖 30
注册 2009-2-19
状态 离线
『第 14 楼』:  

非常感谢。 我发现 直接 for %%i in (\\%~1\c$\windows\system32\drivers\etc\hosts) do (
    if  not "%%~zi"=="%hosts%" echo %~1>>1.txt 就能对比了。 不用在多执行映射了。

非常非常感谢。。 由于比较急才这样问的。 我目前正在学习批处理。

2009-6-24 07:57
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
Hanyeguxing
银牌会员

正在学习中的菜鸟...


积分 1039
发帖 897
注册 2009-3-1
来自 在地狱中仰望天堂
状态 离线
『第 15 楼』:  

使用net use建立完连接,命令和批处理直接就可以直接读写远程文件
在这里for 直接读远程的host 文件

  Quote:
Originally posted by chenall at 2009-6-24 07:36:
多谢楼上的解释,

楼主如果真想学好批处理.
应该好好看一下CMD命令的帮助,善用 /?
里面一般都有例子.试一次可能看不出来有什么作用,那就多试几次.

我从DOS的命令开始学起的,当时网络还不是很发达,都是一条命令/?然后一个一个参数加上去尝试的.

现在网络很方便.而且CMD的帮助都是中文的,应该学起来也比较快.  

现在的xp 里默认就集成着强大的帮助与支持中心

[ Last edited by Hanyeguxing on 2009-6-24 at 08:08 ]



批处理之家 http://bbs.bathome.net/forum-5-1.html
2009-6-24 08:06
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: