中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-06-14 18:57
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 提取文件逐行內容,進行運算 問題! 麻煩高手解答.!
楼 主 提取文件逐行內容,進行運算 問題! 麻煩高手解答.! 发表于 2006-06-07 09:31 ·  中国 江苏 苏州 电信
中级用户
★★
过度热情
积分 321
发帖 139
注册 2006-03-21 17:19
UID 52521
性别 男
状态 离线
如何提取一下文件中的 每一行中的 一欄字符並進行如下算法.
(函shu down time 的行累加,) 減去 (函 boot star time的行累加)
如54883+54891+55849-54877-54887-55843=?

for /f "delims=! tokens=2" %%i in (1.txt) do(??????????)
以下是文件.1.txt!
boot star time 2006-06-06 星期二 15:14:37.57 record! 54877
shut down time 2006-06-06 星期二 15:14:43.27 record! 54883
boot star time 2006-06-06 星期二 15:14:47.66 record! 54887
shut down time 2006-06-06 星期二 15:14:51.36 record! 54891
boot star time 2006-06-06 星期二 15:30:43.18 record! 55843
shut down time 2006-06-06 星期二 15:30:49.99 record! 55849
2 试试看! 在xp下试验成功! 发表于 2006-06-07 12:12 ·  中国 广东 广州 中移铁通
中级用户
★★
积分 256
发帖 93
注册 2006-03-26 22:12
UID 52853
性别 男
来自 广东
状态 离线
boot star time 是单行
shut down time 是双行
那下面代码就可实现楼主的要求.

@echo off
set n=0
set sum=0
for /f "delims=! tokens=2" %%i in (1.txt) do (
call :s %%i
)
echo %sum%
goto :EOF

:s
set /A n+=1
if "%n%"=="1" (set /A sum-=%1)else set /A sum+=%1 & set n=0
goto :EOF


[ Last edited by doscc on 2006-6-7 at 12:15 ]
3 发表于 2006-06-07 17:13 ·  中国 江苏 苏州 电信
中级用户
★★
过度热情
积分 321
发帖 139
注册 2006-03-21 17:19
UID 52521
性别 男
状态 离线
謝謝.!
又學到一點東西.!
GOTO:EOF就是返回到哪個FOR語句吧.!
%1就是繼承FOR語句的%i把!.

如果我想實現兩個for語句的牽套.實現吧如題的for /f "delims=! tokens=2" %%i in (1.txt) do(......)
分別定義給set1~set6這幾個變量.!例如(set1=54877 ,set2=54883
set3=54887......)

本人想看看兩個for語句的變量是怎麼傳遞的.!
謝謝
4 发表于 2006-06-07 17:30 ·  中国 北京 联通
银牌会员
★★★
DOS联盟捡破烂的
积分 1,144
发帖 425
注册 2005-10-20 00:00
UID 43784
来自 北京
状态 离线
应该可以更加简洁,如下代码:
@echo off&setlocal enabledelayedexpansion
set /a l=0
for /f "tokens=2 delims=!" %%i in (1.txt) do (
set /a l=%%i+!l!
)
echo %l%
5 发表于 2006-06-07 17:42 ·  中国 江苏 苏州 电信
中级用户
★★
过度热情
积分 321
发帖 139
注册 2006-03-21 17:19
UID 52521
性别 男
状态 离线
re : bagpipe
set /a l=%%i+!l! 是將六個數累加.!與我的題議不符合.!
6 发表于 2006-06-08 10:23 ·  中国 北京 联通
银牌会员
★★★
DOS联盟捡破烂的
积分 1,144
发帖 425
注册 2005-10-20 00:00
UID 43784
来自 北京
状态 离线
@echo off&setlocal enabledelayedexpansion
set /a l=0
for /f "tokens=2 delims=!" %%i in (1.txt) do (
set /a n+=1
if !n!==1 (
set /a l=!l!-%%i
) else (
set /a l=!l!+%%i&set n=0
)
)
echo %l%
流泪而走.........
7 发表于 2006-06-08 11:26 ·  中国 江苏 苏州 电信
中级用户
★★
过度热情
积分 321
发帖 139
注册 2006-03-21 17:19
UID 52521
性别 男
状态 离线
謝了.!
8 发表于 2006-06-08 11:59 ·  中国 山西 大同 中移铁通
元老会员
★★★★
Batchinger
积分 4,432
发帖 1,512
注册 2002-10-18 00:00
UID 19
性别 男
状态 离线
Re piziliu2004(3楼):

实际上你的命题没有必要也很难用嵌套循环来实现,而循环之间的变量传递也不是很复杂,基本上可以说,在内层循环中可以直接应用外层循环的变量,只要它没有被内层循环的变量所覆盖,这取决于变量的命名。比如:

for /l %%i in (1,1,5) do for %%j in (a,b,c,d) do echo.Counter:%%i%%j

至于你提到的将文件内容逐行获取到环境变量,感觉没有太大意义,因为通常我们都是在获取某一行内容后即时进行各种处理后输出。不过仍然给出示例代码以供参考。


@echo off & setlocal EnableDelayedExpansion
for /f "tokens=8" %%i in (1.txt) do (
set /a c+=1
set set!c!=%%i
)
set set
※ Batchinger 致 Bat Fans:请访问 批处理编程的异类 ,欢迎交流与共享批处理编程心得!
9 发表于 2006-06-08 13:44 ·  中国 江苏 苏州 电信
中级用户
★★
过度热情
积分 321
发帖 139
注册 2006-03-21 17:19
UID 52521
性别 男
状态 离线
謝謝willsort
版主.
小弟想問幾個問題
1: .set set 是顯示當前所有設定的變量麼?.那位什麼我rem 掉"set set"會設定變量失敗呢?

2: 還有位什麼我在set set!c!=%%i後插入"echo %set!c!%"顯示失敗呢?
10 发表于 2006-06-08 14:07 ·  中国 四川 南充 电信
超级版主
★★★★
我爱DOS
积分 5,310
发帖 2,044
注册 2005-09-26 12:00
UID 42843
性别 男
来自 四川南充
状态 离线
1: set set 会显示%set%的值!
2:set set!c!=%%i後不能有其他命令,否则都会成为变量!
11 发表于 2006-06-08 14:40 ·  中国 江苏 苏州 电信
中级用户
★★
过度热情
积分 321
发帖 139
注册 2006-03-21 17:19
UID 52521
性别 男
状态 离线
還是有點迷糊.
1: set set 会显示%set%的值! 那麼僅僅顯示%set%而已為什麼掉"set set"整個批處理會沒辦法實現設置變量的功能呢?.

2:set set!c!=%%i後不能有其他命令,否则都会成为变量!是為什麼?
難道是!c!的問題?.

3:順便問一下.!c!為什麼不能用%c%代替呢?
12 发表于 2006-06-08 14:55 ·  中国 四川 南充 电信
超级版主
★★★★
我爱DOS
积分 5,310
发帖 2,044
注册 2005-09-26 12:00
UID 42843
性别 男
来自 四川南充
状态 离线
13 发表于 2006-06-08 15:12 ·  中国 江苏 苏州 电信
中级用户
★★
过度热情
积分 321
发帖 139
注册 2006-03-21 17:19
UID 52521
性别 男
状态 离线
re:qwe1234567
版主 謝謝.! 是我誤解了.
我是這麼判斷的. rem set set--> 批處理執行完返回命令行後 ,--> 我執行"set"卻看不到set1~setn這些變量.
經過驗證原來我不去掉set set. 我執行set我同樣看不到set1~setn這些變量.

1: 為什麼看不到設定的set1~n變量. 是批處理setlocal EnableDelayedExpansion再作怪麼?

2: 如果我想讓批處理結束後. 返回dos命令下執行set仍然可以看到我設置的變量怎麼實現呢?
14 发表于 2006-06-08 20:40 ·  中国 山西 临汾 中移铁通
元老会员
★★★★
Batchinger
积分 4,432
发帖 1,512
注册 2002-10-18 00:00
UID 19
性别 男
状态 离线

───────────────── 版务记录 ─────────────────
执行:Will Sort
操作:删除主题:《21098 - 如果我想實現兩個for語句的嵌套傳遞變量.實現如題 》
说明:原主题与现主题部分内容重复
处罚:扣除因发表该主题而奖励的6点积分,扣除主题违规惩罚性2点积分
───────────────── 版务记录 ─────────────────


Re piziliu2004:

!c!是变量延迟扩展的用法,在本论坛已有多次解释,建议你先搜索一下,另外可以参考 cmd /? 的命令行帮助信息。

set1~n失效确实是setlocal的原因,具体细节,请参考setlocal /?以及Windows的帮助和支持中心的相关信息。

通常,我们不需要将批处理内的变量修改在批处理结束以后仍然保留,尤其是多个变量的情况,如果你有这方面的需要,则说明程序的结构设计存在一定的缺陷。当然,将变量修改保持到批处理以外是可以的,最简单的方法是不使用setlocal命令,如果必须要使用它,比如用它开启变量延迟扩展特性,则需要使用另外一个技巧。

这个技巧我很少用到,只有在难以避免使用setlocal且必须保存变量供给外部程序引用时才会使用。方法是使用利用率很低的endlocal命令。例如,在程序结束前想要保留变量envar的修改可以在程序末尾插入以下语句。
endlocal & set envar=%envar%

对于8楼的代码,则相对更为复杂一些,因为需要保留多个动态名的变量。可以使用以下的代码。


@echo off & setlocal EnableDelayedExpansion
if exist _setvar.bat del _setvar.bat
for /f "tokens=8" %%i in (1.txt) do (
set /a c+=1
echo set set!c!=%%i>>_setvar.bat
)
endlocal & if exist _setvar.bat (call _setvar.bat & del _setvar.bat)
set set


[ Last edited by willsort on 2006-6-8 at 20:44 ]
※ Batchinger 致 Bat Fans:请访问 批处理编程的异类 ,欢迎交流与共享批处理编程心得!
15 发表于 2006-06-10 15:28 ·  中国 山东 菏泽 电信
银牌会员
★★★
积分 1,246
发帖 488
注册 2003-11-11 00:00
UID 12699
性别 男
状态 离线
收藏!!!
论坛跳转: