搜索
bottom↓
回复: 37

我们这里有DOS批处理的高手吗?

[复制链接]
头像被屏蔽

出0入0汤圆

发表于 2007-9-16 07:32:45 | 显示全部楼层 |阅读模式
比如不用查资料就能看得懂: for /f "tokens=2 delims=()" %%i in (a.txt) do set d=%%i

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2007-11-29 12:06:23 | 显示全部楼层
给出个例子可能更容易理解,
  文件a.txt的内容:(共三行)
     armok()avr
     fightman()pic
     steven()unix
  那么执行该dos命令行 for /f "tokens=2 delims=()" %%i in (a.txt) do set d=%%i
就会给变量d赋三次值:
    d=avr
    d=pic
    d=unix

出0入0汤圆

发表于 2007-11-29 12:12:35 | 显示全部楼层
简单说for /f命令就是处理以delims所设定的分隔符分析 跟在in 后面的集合(a.txt)
头像被屏蔽

出0入0汤圆

 楼主| 发表于 2007-11-29 12:26:09 | 显示全部楼层
呵呵,现在我们的服务器的监控程序,就是我用DOS编写的。 约300行长度,涉及读取网页,分析网页数据,确定oracle数据库状态与we b发布软件工作状态。发生意外时能自动修正,并能将系统日志记录在log文件里。(抱歉为了避免服务器受到针对性的攻击,代码就不上传了。)

DOS之前是使用 java 或 delphi 编写,发现理论上工作没有问题,但长时间运行后,总偶尔发生卡死的情况。

使用DOS就与微软的系统完全接轨,连续运行了2个月,没有发生过任何意外情况。

出0入0汤圆

发表于 2007-11-29 12:37:56 | 显示全部楼层
原来高手在这,呵,正好请教阿莫一个问题,在winxp下我写了一个bat文件,如下
net start someservices    ,这行没问题,启动并等服务启动
c:\someact.exe            ,这行要求立即执行someact.exe,不等这个文件执行结束(因为它是GUI的),用本行不能实现此功能,用
                          ,start c:\someact.exe也不行,用call 更不行,这行该怎么写?
exit                      ,关闭当前打开的这个控制台窗口
头像被屏蔽

出0入0汤圆

 楼主| 发表于 2007-11-29 12:41:26 | 显示全部楼层
我目前用的批处理,都是一行执行完后,然后再执行下面一行。

你的要求有点特别,就算是使用 call 也不能解决。 我帮你查找一下有没有实现方法。
头像被屏蔽

出0入0汤圆

 楼主| 发表于 2007-11-29 12:52:36 | 显示全部楼层
搞好了。 以下的批处理示范打开 notepad :

echo ..........start ......
start notepad
echo ..........end ...
pause

以下为运行结果:








start 是用来启用exe ,call 用来启用批处理。

start 的详细用法也可以参考:

出0入0汤圆

发表于 2007-11-29 13:13:40 | 显示全部楼层
谢谢阿莫。我的问题找到了原因,还没找到处理方法,原因是文件名为长文件名,中间有空格,用start不灵,加“”也不行,变成title了
start c:\my.exe     //OK
start c:\Program files\my.exe // 会变成 start c:\Program ,然后说找不到
start "c:\Program files\my.exe”  // 会把“”内的东西当成title,不执行
头像被屏蔽

出0入0汤圆

 楼主| 发表于 2007-11-29 13:32:03 | 显示全部楼层
很简单。

在系统变量 path 里,加入 c:\Program files\ 作为搜索路径之一就行。



这样,你上面的语句直接改成:

start my.exe

出0入0汤圆

发表于 2007-11-29 13:39:22 | 显示全部楼层
只能加路径啊?我不喜欢把啥都加到path里来。
头像被屏蔽

出0入0汤圆

 楼主| 发表于 2007-11-29 13:44:40 | 显示全部楼层
如果你啥都需要按自己的想法去做,就不要使用批处理了。

批处理有点像 hmtl 语法,只提供一种最基本的语法与最基本的功能。 它并不强大,为了实现某个功能,有时你不得不学会妥协。

但批处理的优点却是其它语言无法比拟的: 与操作系统100%融合。就算是使用VC,也很难做到这一点,更不要说是java或delphi了。
头像被屏蔽

出0入0汤圆

 楼主| 发表于 2007-11-29 13:48:22 | 显示全部楼层
以下是我编写的 kill 掉 windows 某个进程的批处理。 原创的 :)

经常我们发现,在 services里,有时重启某个服务会很慢甚至可能卡死。 就算是 tomcat 这类成熟软件,有时也会碰到。

所以,直接进入操作系统,将进程杀死,可以有效地解决这个问题。 开始我以为只是unix才有的,原来 dos 也有!

它先去判断有没有 tomcat进程,如果没有,就提示不用kill。如果有,就将它kill掉。

下面的批处理有点复杂,有兴趣可以慢慢研究。 本贴可以置成COOL 了!

==========================================================


@echo off

set PID=

::读取tomcat6 PID
if exist tasklist.txt del tasklist.txt
tasklist /nh /fi "imagename eq tomcat6.exe" >tasklist.txt

::如果tasklist.txt没有内容,即tomcat6没有启动时,pid不会有数据。
for /f "skip=1 tokens=2" %%M in (tasklist.txt) do set PID=%%M

if "%PID:~0,1%" gtr "0" (goto kill_tomcat6) else (goto no_tomcat6)

:kill_tomcat6
echo %date% %time% kill tomcat6 ...
::杀tomcat6进程
ntsd -c q -p %PID%
goto end

:no_tomcat6
echo No tomcat6 service!

:end

pause

出0入0汤圆

发表于 2007-11-29 13:57:28 | 显示全部楼层
怎么能说是啥都按我的想法来做呢,做为操作系统的一部分,start命令竟然不支持长文档名。在path里加入的东西太多不是好习惯,就像编程大量开全局变量一样,容易产生冲突。另外,现在这个东西已经不再是dos了,应称为32位的windows控制台,不过armok的功力还是很强,当年borland的dephi4的一个补丁安装程序是用.bat写的,很牛,约有1000多行。
还有一个XP优化的,也很强,写了1500行。学习一下。
点击此处下载ourdev_183814.txt(文件大小:49K)
头像被屏蔽

出0入0汤圆

 楼主| 发表于 2007-11-29 14:28:36 | 显示全部楼层
DOS开始是不支持带空格的文件夹的。后来由于 windows 的出现,导致了现在的问题。空格在DOS里,是作为默认的参数分隔符。所以,DOS不知道你输入的空格,到底是目录空格,还是命令分隔,导致了错误的发生。 一般是通过加入 “”解决空格的问题。如果“”仍不能解决,就得使用一些“旁门左道”达到目的了。

在  OS script 的处理能力上,DOS肯定是比不上UNIX的。但DOS能做到我上面提到的服务器监控功能,我已经很满意,虽然搞了我一个通宵,试了无数次才成功。

出0入0汤圆

发表于 2007-11-29 15:15:53 | 显示全部楼层
解决了,/D参数加长文档名不会和title命令行参数相混,所以这样就可以
start /D"C:\program files"  my.exe
仍要谢谢armok。
头像被屏蔽

出0入0汤圆

 楼主| 发表于 2007-11-29 15:29:08 | 显示全部楼层
才留意到6楼的贴的Start帮助,是有 /Dpath 参数的。有点奇怪D后面是没有空格的。

出0入0汤圆

发表于 2007-11-30 12:17:58 | 显示全部楼层
Program files要写成Progra~1

出0入0汤圆

发表于 2007-12-13 18:03:06 | 显示全部楼层
net start someservices    ,这行没问题,启动并等服务启动
c:\someact.exe            ,这行要求立即执行someact.exe,不等这个文件执行结束(因为它是GUI的),用本行不能实现此功能,用
                          ,start c:\someact.exe也不行,用call 更不行,这行该怎么写?
exit                      ,关闭当前打开的这个控制台窗口

看看

start/?
cmd/?

不等这个文件执行结束
----------------------
cmd /k ...   执行后不退出(类似在后台执行),同样可用“”指定有空格等字符串在内的命令行。
头像被屏蔽

出0入0汤圆

 楼主| 发表于 2007-12-13 18:48:41 | 显示全部楼层
/C      执行字符串指定的命令然后终断
/K      执行字符串指定的命令但保留
/S      在 /C 或 /K 后修改字符串处理(见下)
/Q      关闭回应
/D      从注册表中停用执行 AutoRun 命令(见下)
/A      使向内部管道或文件命令的输出成为 ANSI
/U      使向内部管道或文件命令的输出成为 Unicode
/T:fg   设置前景/背景颜色(详细信息,请见 COLOR /?)
/E:ON   启用命令扩展(见下)
/E:OFF  停用命令扩展(见下)
/F:ON   启用文件和目录名称完成字符 (见下)
/F:OFF  停用文件和目录名称完成字符(见下)
/V:ON   将 ! 作为定界符启动延缓环境变量扩展。如: /V:ON 会
        允许 !var! 在执行时允许 !var! 扩展变量 var。var 语法
        在输入时扩展变量,这与在一个 FOR 循环内不同。
/V:OFF  停用延缓的环境扩展。

请注意,如果字符串有引号,可以接受用命令分隔符 '&&' 隔开


我分别测试了 cmd /k notepad 及 /c /s /q 共计四种参数,发现前面两种的确能弹出记事本,但命令行却卡死了,需要关闭notepad才能回到命令行,不符合上面的要求。 看来只有 start 才能做得到?

出0入0汤圆

发表于 2007-12-14 01:14:22 | 显示全部楼层
###这样不行吗?
taskkill /f /im tomacat6.exe
头像被屏蔽

出0入0汤圆

 楼主| 发表于 2007-12-14 05:06:42 | 显示全部楼层
谢谢【21楼】 DotNet ,

的确是行的,而且更简单!

C:\Documents and Settings\Administrator>taskkill /f /im tomcat6.exe
成功: 已终止进程 "TOMCAT6.EXE",其 PID 为 1716。

出0入4汤圆

发表于 2009-7-17 21:06:16 | 显示全部楼层
留个记号。

出0入0汤圆

发表于 2010-1-29 17:00:55 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-1-30 12:19:15 | 显示全部楼层
阿莫真是dos高手啊

出0入0汤圆

发表于 2010-3-10 22:45:58 | 显示全部楼层
高手啊

出0入0汤圆

发表于 2010-3-10 23:23:07 | 显示全部楼层
start "" "C:\Program Files\文本\文本.EXE"

我加长文件名是这样加的,也没注意到/D不能有空格

taskkill /f /im tomacat6.exe  会不会引起应用程序的数据丢失?

出0入0汤圆

发表于 2010-3-18 09:54:52 | 显示全部楼层
学习了

出0入0汤圆

发表于 2010-3-18 12:07:27 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-3-28 15:19:56 | 显示全部楼层
有点意思

出0入0汤圆

发表于 2010-4-4 22:22:37 | 显示全部楼层
看了几十分钟,越看越感兴趣,能问问如果想学编这方面的程序要看关于哪方面的书呢?操作系统?还算不上初学者,见谅!

出0入0汤圆

发表于 2010-9-30 21:58:37 | 显示全部楼层
学习了~站长知识真是渊博~

出0入0汤圆

发表于 2010-12-15 19:43:09 | 显示全部楼层
学习了!向高手致敬!!!

出0入0汤圆

发表于 2010-12-15 20:55:47 | 显示全部楼层
mark

出0入0汤圆

发表于 2010-12-15 21:36:06 | 显示全部楼层
mark 学习了

出0入0汤圆

发表于 2011-12-14 11:05:14 | 显示全部楼层
长文件夹 都有缩略名的 通过缩略名来运行 高手果然云集于此哦

出0入0汤圆

发表于 2011-12-14 11:07:06 | 显示全部楼层
DOS的书已经不多见了,95-98年左右出的书还能有这方面资料
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-26 06:13

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表