Board logo

标题: [已结]关于CMD屏幕保存输出的问题 [打印本页]

作者: acoreq     时间: 2006-8-3 09:57    标题: [已结]关于CMD屏幕保存输出的问题

问题很简单,
1.打DIR,回车  会有很多显示
2.然后什么命令能把上面DIR已经显示的内容全部>>到一个file里呢?

[ Last edited by HAT on 2008-12-26 at 13:09 ]
作者: cr2516     时间: 2006-8-3 11:00
dir >>1.txt
作者: acoreq     时间: 2006-8-3 21:39
拜托。。。不是这个。。。  是你已经敲回车了,把上面显示的东西再弄到文件里去
作者: IceCrack     时间: 2006-8-3 22:26
标记.然后粘贴到一个文件就行了
作者: doscc     时间: 2006-8-4 01:05

可以这样做.效果一般!
dir >file.txt && type file.txt

作者: namejm     时间: 2006-8-4 22:06
  我也来一个:
dir & dir>file.txt

作者: zh159     时间: 2006-8-5 00:47
按楼主的要求,只能使用标记方式,“dir>*.txt”之类的都是马后炮^_^
作者: freshman8008     时间: 2006-8-5 09:25
俺是新手,正想问这问题呢。
输入DOS命令,回车,滚屏后看不到全部信息,用上面的方法可以把全部信息保存到TXT文件里么?
作者: namejm     时间: 2006-8-5 11:07
Re zxcv:

  只要能实现楼主的意图就行了,又何必拘泥于楼主的实现过程呢?正所谓殊途同归啊。

Re freshman8008:

  用上面的方法可以把全部信息保存到txt文件里去,你大可不必担心漏掉了内容。
作者: zh159     时间: 2006-8-5 14:20
是可以实现楼主的意图

但楼主真正的意图却是:

  Quote:
Originally posted by acoreq at 2006-8-3 21:39:
拜托。。。不是这个。。。  是你已经敲回车了,把上面显示的东西再弄到文件里去

我们的“>file.txt”方式却不是楼主真正的意图
作者: namejm     时间: 2006-8-5 15:27
Re zxcv:

  我觉得楼主在3楼的表述是针对2楼的答复的,2楼的代码只是把内容输到文件里去了,但是并没有在屏幕上显示出dir的执行结果。

  又或者楼主之前在CMD窗口中执行了其他命令,在屏幕上有了一些执行结果的显示,然后要把它们和dir执行结果统统弄到文件里去?

[ Last edited by namejm on 2006-8-5 at 15:28 ]
作者: bagpipe     时间: 2006-8-5 17:49


  Quote:
Originally posted by acoreq at 2006-8-3 09:57:
问题很简单,
1.打DIR,回车  会有很多显示
2.然后什么命令能把上面DIR已经显示的内容全部>>到一个file里呢?

问题很简单???照你这样说我觉得不能实现,dir完毕后按回车键然后在把刚才的显示内容保存成一个文件,呵呵,异想天开..............
作者: 3742668     时间: 2006-8-5 18:45

@echo off
    doskey /history | findstr /v /x "%0" >1.txt
    for /f "delims=" %%i in (1.txt) do set lastCMD=%%i
    %lastCMD% >1.txt
知识面有多大,脚本的功能就有多大。
作者: namejm     时间: 2006-8-5 19:15
  13楼的什么意思啊?看不懂呢。
作者: zh159     时间: 2006-8-5 23:22
doskey /history:显示保存在内存中的所有命令。


不过在批处理里俺没试验成功,只能在命令提示符里成功,其实也是类似“dir & dir>file.txt”之类的,利用“doskey /history”把命令提示符里之前所有的命令重新按顺序在运行一次,>为1.txt文件
作者: acoreq     时间: 2006-8-5 23:27
To 3742668
在CMD里RUN的时候有这个错误:
The process cannot access the file because it is being used by another process.
不太清楚为什么。。。
但是从DOSKEY的解释来看,似乎有RECALL的功能,不过后面的“%0”我就不清楚是哪个参数了。。。  望解释:)

To all:
我的本意是这样子的...
当一个脚本中前前后后ECHO了很多东西,等到脚本结束的时候,我想把之前ECHO的东西(也就是在CMD PROMPT里显示的那些东西)全部保存到一个文件里,作为一个FINAL REPORT。
因为在BAT里,你如果在ECHO后面直接>/>> filename的话,那一行只会被写到文件里去,不会在CMD PROMPT里显示。
现在大家清楚了吧:)
作者: namejm     时间: 2006-8-5 23:55
Re acoreq 『第 16 楼』:

  终于把你的意图完整地表达出来了,这个过程还真有点折磨人啊。

  其实你可以多次使用形如 echo & echo>>filename.txt 的语句来在屏幕显示和输出到文件中去,要是在最后才来一次性地生成屏幕上显示的内容的话,在很多情况下是无法用命令来做到的,只能用最笨的标记的方法来完成,因为一个批处理中,上下语句往往是有前后关系的,后一句可能把前一句的变量给改变了。
作者: acoreq     时间: 2006-8-6 00:48
哦。。  OK  那我就用&吧  和和
就是重复的命令条多一些  看起来不顺眼  哈哈:)

谢谢~
作者: willsort     时间: 2006-8-6 03:00


  Quote:
Originally posted by 3742668 at 2006-8-5 18:45:
知识面有多大,脚本的功能就有多大。

Re acoreq:

      诚然!我们选择解决问题的方法,取决于我们如何理解问题本身。

      在你的应用中,使用&或者不使用&分别执行两次命令将输出分别重定向,可能是最简单的方案,不管它有多么繁琐,它至少简单,而简单与简洁并不等同。
========================================

      但可能你会遇到一些预期的问题,比如某些命令第一次执行与第二次执行的输出往往并不相同,比如 echo.%time% ,此时分两次执行将得到不同的结果,他们被分别重定向了到文件和控制台上。

      这并不是我们想要的结果,所以我们需要改进。最先能想到的,我们可以将所有的命令输出首先重定向到文件,然后在最护 type 这个文件到控制台上。这似乎是个不错的方案,至少它解决了第一个问题,而且也足够简单。

dir > cmd.log
cd >> cmd.log
...
type cmd.log
========================================

      但仍然有新的问题,比如在很多时候,我们希望在执行了某些命令后,能够立即查看它的输出,我们可以此时就 type 这个文件,但如果以后有新的命令输出需要重定向,我们就面临两难:如果在查看完旧的命令日志后删除它,则日志文件将缺少前面的命令输出;而如果不删除,继续用>>添加新的内容,则在随后的 type 时,前面的命令输出将再次输出到屏幕上。

      因此改进需要继续,或许将命令日志由一个拆成多个是个办法——每个命令都有单独的命令日志,它们可以独立的重定向并且输出,而不会相互掣肘。最后,如果我们想得到一个完整的日志文件,只需要用 copy 简单的合并一下即可。这个方案仍然足够简单,而且可以解决目前面临的问题, 除非有新的问题。

dir > _dir.log
type _dir.log
cd > _cd.log
type _cd.log
...
copy _*.log cmd.log >nul
del _*.log
========================================

      不过,如果你自命是一个很爱钻研(较真的同义词)的批处理设计者,因此对以上的方案都抱有某种不满(比如第三方案中的临时日志文件),我们就需要寻找更合适的方案。

      首先,我会想到一个名为 tee (很古怪的名字)的 Unix 工具,它是将标准输出的文本输出到控制台的同时输出到文件中(其中未涉及重定向的概念,但本质上是类似的机制)的标准工具,我们可以很轻易的获得这个工具的DOS或者Windows移植版[1]。

      它的用法很简单,在[2]中曾有提及

dir | tee cmd.log
cd | tee --append cmd.log
========================================

      但如果“较真的你”对第三方工具比较抵触,或者有无法使用的苦衷(比如如如何保持跨平台的兼容性),那么继续寻找新的方案。

      很快你就会发现William Allen的vbs脚本[3],这一个tee.exe的第一方实现,也就是说我们用vbs脚本完成了类似tee的功能。

  Set StdIn = WScript.StdIn
  Set StdOut = WScript.StdOut
  Set Args=WScript.Arguments
  LogFile=Args(0)
  Set fso = CreateObject("Scripting.FileSystemObject")
  Set LogFile= fso.CreateTextFile(Args(0))

  Do While Not StdIn.AtEndOfStream
       str = StdIn.ReadLine
       StdOut.WriteLine str
       LogFile.WriteLine str
  Loop

  LogFile.Close

      将这个脚本保存为 tee.vbs ,然后我们就可以使用下面的方法保存命令的输出了。当然我们可以简化或增强这个脚本,比如让它可以将命令输出添加到日志文件中,而不是覆盖。

dir | cscript//nologo tee.vbs cmd.log
========================================

      最后,如果你是纯DOS的拥护者,对vbs脚本并不感冒。那么还会有一个ASCode等待你去发现[4]。这是ASCII Assembler技术专家 Herbert Kleebauer 的又一款ASCode力作。

echo Bj@jzh`0X-`/PPPPPPa(DE(DM(DO(Dh(Ls(Lu(LX(LeZRR]EEEUYRX2Dx=>tee.com
echo 0DxFP,0Xx.t0P,=XtGsB4o@$?PIyU WwX0GwUY Wv;ovBX2Gv0ExGIuht6>>tee.com
echo @VyI?@xAp~sA`LZNxOq@Kt@FB?sUs`LbLB?tgj`{gjB~0x>>tee.com

      这个tee.com的用法也并不会比tee.exe和tee.vbs复杂多少,而且在 DOS/9X/NT 下有一致的表现,除了这个16位的.com程序会影响CMD@NT的代码页之外,而且有些“拒人千里”的晦涩难懂之外,它应该还算是一个Pefect的方案。

dir | tee > cmd.log
cd | tee >>cmd.log
========================================

[1]TEE.EXE
http://www.cn-dos.net/forum/atta ... 62e9&download=1

[2][求助]如何实现既在屏幕上显示执行结果又可以把结果保存到
http://www.cn-dos.net/forum/viewthread.php?tid=21531

[3]alt.msdos.batch.nt > Can you use redirection to two outputs?
http://groups.google.com/group/a ... sg/514d1343700b423e

[4]alt.msdos.batch.nt > Tee
http://groups.google.com/group/a ... sg/b157065b8b12ebb2

[ Last edited by willsort on 2006-8-6 at 03:09 ]
作者: namejm     时间: 2006-8-6 08:18
  willsort分析得十分透彻,几乎把所有可能的情况都考虑到了,理论水平如此深厚,叹服。
作者: superfan     时间: 2006-8-6 09:51
dir * >#.txt
作者: acoreq     时间: 2006-8-6 16:10
不愧是斑竹。。。佩服之心有如滔滔黄浦江水。。。

虽然真的是有些“晦涩难懂”,不过大家的思路还是统一的:)
如果有花的话送你999朵  哈哈~!
谢谢!!
作者: bagpipe     时间: 2006-8-6 20:14
我是没有那本事来解决这个问题..........
作者: acoreq     时间: 2006-8-6 20:43
好拉,斑竹CLOSE这个贴吧  和和
作者: freshman8008     时间: 2006-8-7 09:22
别关。

俺试过啦,输入arp >>1.txt
回车后依然是滚屏,信息并没有进入到1.txt里,1.txt是空的。
怎么回事啊?
作者: namejm     时间: 2006-8-7 12:50
  arp不带参数时,显示的是帮助文件,可能在这种情况下帮助文件的信息是强制输出到显示屏上的,不能重定向吧。
作者: bagpipe     时间: 2006-8-7 17:02
那我也来一个,别拿板砖拽我就行,一个命令执行结果记录批处理,没啥含量啊...........就是为了得分,^_^

@echo off
setlocal
:top
set/p aa=%cd%^>
if /i "%aa%"=="quit" goto :eof
%aa% 2>nul&&%aa% >>tmp.txt||echo 命令错误&&goto :eof
goto top
作者: freshman8008     时间: 2006-8-8 08:48


  Quote:
Originally posted by namejm at 2006-8-7 12:50:
  arp不带参数时,显示的是帮助文件,可能在这种情况下帮助文件的信息是强制输出到显示屏上的,不能重定向吧。

那可怎么办?偶要的就是这些帮助信息。还有其他一些DOS命令也是这样,不加开关可得到帮助信息,但往往都滚屏。有什么办法能够全部收集这些信息么?谢谢!:)
作者: zh159     时间: 2006-8-8 09:27
试了一下:
只有“arp 2>1.txt”才能输出到TXT文件,但不知道对其他的命令效果怎样
作者: bagpipe     时间: 2006-8-8 16:57
@echo off
setlocal
:top
set/p aa=%cd%^>
if /i "%aa%"=="quit" goto :eof
%aa% 2>nul&&%aa% >>tmp.txt||%aa% >>tmp.txt 2>&1||echo 命令错误或者特殊命令&&goto :eof
goto top
这样不就解决了
作者: chenall     时间: 2006-8-8 17:21

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

      最后,如果你是纯DOS的拥护者,对vbs脚本并不感冒。那么还会有一个ASCode等待你去发现[4]。这是ASCII Assembler技术专家 Herbert Kleebauer 的又一款ASCode力作。

echo Bj@jzh`0X-`/PPPPPPa(DE(DM(DO(Dh(Ls(Lu(LX(LeZRR]EEEUYRX2Dx=>tee.com
echo 0DxFP,0Xx.t0P,=XtGsB4o@$?PIyU WwX0GwUY Wv;ovBX2Gv0ExGIuht6>>tee.com
echo @VyI?@xAp~sA`LZNxOq@Kt@FB?sUs`LbLB?tgj`{gjB~0x>>tee.com

      这个tee.com的用法也并不会比tee.exe和tee.vbs复杂多少,而且在 DOS/9X/NT 下有一致的表现,除了这个16位的.com程序会影响CMD@NT的代码页之外,而且有些“拒人千里”的晦涩难懂之外,它应该还算是一个Pefect的方案。

dir | tee > cmd.log
cd | tee >>cmd.log
========================================
这一段代码很强啊.收藏了.
作者: freshman8008     时间: 2006-8-9 09:26


  Quote:
Originally posted by zxcv at 2006-8-8 09:27:
试了一下:
只有“arp 2>1.txt”才能输出到TXT文件,但不知道对其他的命令效果怎样

奇怪?!试了,可以产生1.txt文件,但依然是空的。……!真是笨死偶了。:(
作者: freshman8008     时间: 2006-8-10 09:25
偶不想新开楼了,就借楼主的地儿用一下。
是不是必须在纯DOS下才可以做到?哪位帮解答一下,谢啦!
作者: zh159     时间: 2006-8-10 10:01
我在两台XP电脑的命令提示符试了,“arp 2>1.txt”可以生成有内容的文本
作者: freshman8008     时间: 2006-8-13 09:08
偶系统98,再试,依然不行。算啦,不麻烦大伙了,或许98就是不行呢。谢各位啦。
作者: acoreq     时间: 2006-8-13 16:35
会不会是98里的命令格式和XP里的不一样啊?
作者: freshman8008     时间: 2006-8-15 09:07


  Quote:
Originally posted by acoreq at 2006-8-13 16:35:
会不会是98里的命令格式和XP里的不一样啊?

可是我进到DOS模式下也不行,奇怪、奇怪、真奇怪!总不会DOS也不一样吧?!
作者: hngaoshou     时间: 2007-3-5 04:42
我想 是楼主   有时  看不到显示 的内容  
你可 用如下命令  ::


dir | more



不知道 楼主  是不这意思

[ Last edited by hngaoshou on 2007-3-5 at 04:46 AM ]
作者: dggold     时间: 2007-9-28 18:15    标题: 关于CMD屏幕保存输出的问题

有没有像超级终端”程序下的/ 传送/ 捕获文本类似的功能软件,可以记录cmd屏幕下得所有的内容(包括telnet后操作,原cmd屏只能记录几百行的内容)。
作者: yoyu     时间: 2007-10-8 03:02
顶住锅盖说,lz的情况其实可以copy 和paste的。。(windows xp)

右键, edit-》select all
右键, edit-》copy

然后就可以贴随便哪里了。。。
作者: kulau     时间: 2011-1-5 14:33    标题: tks

tks a lot