中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-09-13 22:25
47,812 主题排行 / 349,916 发帖 / 今日 0 篇 / 48,268 会员排行
论坛回收站 » 继续再来一个for的问题(更改了,主要问题在3楼)
可打印版本  2,047 / 14
第1楼 wwx0423 发表于 2009-06-24 04:37
初级用户 发帖 30 积分 33
继续再来一个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 ]
第2楼 chenall 发表于 2009-06-24 04:42
银牌会员 发帖 469 积分 1,276 来自 福建泉州
自己学习一下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 ]
第3楼 wwx0423 发表于 2009-06-24 04:59
初级用户 发帖 30 积分 33
do 之后如果有指令集是不是 () 括起来。 我使用过 /?查看,但是帮助写的不是很详细。 看的不太懂。
我想要实现的功能是, 从 一个文本里 读取 计算机名,然后做映射, 如果映射不成功就把该计算机名记录下来。如果映射成功 则 判断该 计算机的 hots文件大小,如果大小不等于我要的大小,也把该计算机名记录下来,如果hots文件的大小等于我要的大小则不记录.断开映射, 继续重新读取下一个计算机名。 之前你有教过我怎么去hots的文件大小。
但是 现在 映射的成功和失败判定? 和 让for读一个计算机名后执行完需要的命令后再去读第二个计算机名, 好像for /f 他是全部读取完 再执行吧?

[ Last edited by wwx0423 on 2009-6-24 at 06:25 ]
第4楼 wwx0423 发表于 2009-06-24 05:00
初级用户 发帖 30 积分 33
用 if 和 for 一起使用 最好了。
但是if 和for 的使用 和变量 都不会 ,刚刚才从你那得知 %i和 %%i 在cmd和批处理中的区别。
第5楼 wwx0423 发表于 2009-06-24 05:13
初级用户 发帖 30 积分 33
chenall 在吗? 你能上一下QQ吗?
第6楼 Hanyeguxing 发表于 2009-06-24 05:29
银牌会员 发帖 897 积分 1,039 来自 在地狱中仰望天堂
如果你很想用if ,可以使用语法if [not] errorlevel number command [else expression]
第7楼 wwx0423 发表于 2009-06-24 06:06
初级用户 发帖 30 积分 33
不用 if 能做到 我想要实现的功能吗?
当当只用for 能实现? 
好几个判断的地方。 判断 是否映射成功, 判断文件大小是否等于我要的值。
第8楼 Hanyeguxing 发表于 2009-06-24 06:22
银牌会员 发帖 897 积分 1,039 来自 在地狱中仰望天堂
你在1楼有说要判断文件大小吗?自己看帮助吧
第9楼 wwx0423 发表于 2009-06-24 06:23
初级用户 发帖 30 积分 33
主要的问题在3楼呀。 
第10楼 chenall 发表于 2009-06-24 07:15
银牌会员 发帖 469 积分 1,276 来自 福建泉州
不知是不是没有注意看贴,我上面已经有例子了.
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
第11楼 wwx0423 发表于 2009-06-24 07:23
初级用户 发帖 30 积分 33
看不懂你写的。
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 ]
第12楼 Hanyeguxing 发表于 2009-06-24 07:32
银牌会员 发帖 897 积分 1,039 来自 在地狱中仰望天堂
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 ]
第13楼 chenall 发表于 2009-06-24 07:36
银牌会员 发帖 469 积分 1,276 来自 福建泉州
多谢楼上的解释,

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

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

现在网络很方便.而且CMD的帮助都是中文的,应该学起来也比较快.
第14楼 wwx0423 发表于 2009-06-24 07:57
初级用户 发帖 30 积分 33
非常感谢。 我发现 直接 for %%i in (\\%~1\c$\windows\system32\drivers\etc\hosts) do (
if not "%%~zi"=="%hosts%" echo %~1>>1.txt 就能对比了。 不用在多执行映射了。

非常非常感谢。。 由于比较急才这样问的。 我目前正在学习批处理。
第15楼 Hanyeguxing 发表于 2009-06-24 08:06
银牌会员 发帖 897 积分 1,039 来自 在地狱中仰望天堂
使用net use建立完连接,命令和批处理直接就可以直接读写远程文件
在这里for 直接读远程的host 文件


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 ]
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023